Основы многопользовательской онлайн-игры [закрыто]

9

В настоящее время я работаю над многопользовательской онлайн-игрой в режиме реального времени. Цель состоит в том, чтобы иметь соединение клиент / сервер с использованием протокола UDP. До сих пор я использовал UDP для движений игроков и TCP для событий (стрельба игрока, проигрыш игрока), потому что я должен быть уверен, что такие данные будут поступать всем игрокам, подключенным к серверу. Я знаю, что UDP называется «ненадежным», и некоторые пакеты могут быть потеряны. Но я читал везде, чтобы никогда не смешивать TCP и UDP, потому что это может повлиять на соединение.

Главный вопрос: как мне организовать свою сеть?

UDP не имеет соединения, как мне сохранить кто есть кто? Должен ли я сохранить IP-адреса клиентов в списке?

Должен ли я использовать TCP для важных событий или использовать UDP? Если мне нужно использовать UDP, как я могу убедиться, что данные не будут потеряны?

Используя TCP и UDP, мне нужно сохранить для каждого игрока их IP в списке (для UDP) и TcpClient, который подключен в другом списке (для UDP). Как я могу изменить это, чтобы быть более эффективным?

Lowip
источник
@JoshPetrie этот вопрос является законным «Главный вопрос, как мне организовать свою сеть?». Дело не в том, должен ли я использовать то или это. ОП использует один и нуждается в совете по добавлению другой технологии, которую он уже выбрал. Это широкий вопрос, поскольку ответ заключается не в том, какую технологию следует использовать, а в том, как можно структурировать программное обеспечение, чтобы избежать раздувания труб, уменьшить отставание и повысить надежность независимо от базовой технологии.
Койот
Это также слишком широко. Вопрос должен быть отредактирован (не стесняйтесь, он довольно старый), чтобы быть более тематическим, затем его можно открыть заново.

Ответы:

6

UDP имеет меньше накладных расходов, но за счет потери пакетов, не зная об этом (часть накладных расходов с TCP обеспечивает повторную отправку потерянных пакетов).

Однако большая проблема с использованием UDP состоит в том, что существует много сайтов, которые блокируют весь трафик UDP (за исключением DNS), потому что многие администраторы считают, что это хорошая практика безопасности.

Кроме того, не думайте, что у каждого из ваших игроков будет свой IP-адрес - во многих ситуациях несколько пользователей используют одно и то же подключение к Интернету, и если школьники подсели на вашу игру, вы можете поспорить, что они, вероятно, собираюсь выяснить, как установить и запустить его во время занятий вместо того, чтобы выполнять свою работу (и не хотите ли вы, чтобы они тратили это драгоценное время на вашу игру, а не на чужую?).

Когда ваш TCP-поток открыт, он все еще довольно эффективен. Следующим шагом является минимизация объема данных, которые вы отправляете / получаете, и именно здесь вступает в игру дизайн протокола. Если вы просто отправите несколько байтов для каждой команды (например, «продвинуться вперед») вместо того, чтобы, например, обернуть одну и ту же команду в сотни байтов кода XML, тогда ваше общее потребление пропускной способности сети будет ниже, и меньше циклов ЦП будет быть обязательными для обработки информации (несколько байтов легко сравниваются с разборкой, интерпретацией и проверкой синтаксиса большого фрагмента XML).

Вы, конечно, можете открывать несколько потоков TCP и использовать их для разных целей, например, один для команд, другой для передачи графики, другой для аудио-чата и т. Д. Таким образом, если вы передаете большую графику, которая занимает 5-10 секунд, чтобы скачать, по крайней мере, движения команд игрока не будут отставать, потому что они будут в другом потоке (и вы можете отобразить спрайт по умолчанию, пока не закончится загрузка нового спрайта, что всегда веселее, чем ожидание).

Рэндольф Ричардсон
источник
1
В первоначальном вопросе упоминалась модель клиент-сервер, поэтому «сайты», которые блокируют все UDP, не имеют значения; это проблема клиента, и я сомневаюсь, что многие из них на самом деле блокируют все UDP. «Использование TCP - наихудшая из возможных ошибок, которую вы можете совершить при разработке сетевой игры! Чтобы понять почему, вам нужно посмотреть, что на самом деле делает TCP над IP, чтобы все выглядело так просто!» См. Gafferongames.com/networking-for-game-programmers/udp-vs-tcp
действительно005
@ действительно005: Есть плюсы и минусы в этом - UDP определенно обеспечивает преимущество в производительности, но за счет надежности (именно в этом преимущество TCP). Что касается блокировки UDP, то вы абсолютно правы в том, что это проблема клиента, но во многих корпоративных и образовательных средах я столкнулся с тем, что UDP (за исключением порта 53) блокируется невежественными администраторами, которые считают UDP проблемой безопасности, и таким образом, возможность возврата клиента к TCP может, по крайней мере, означать, что игрок может испытать игру (особенно, если пропускная способность сети достаточно высока).
Рэндольф Ричардсон
@ действительно005: Кроме того, использование комбинации UDP и TCP может быть вполне приемлемым, поскольку TCP может использоваться для передачи данных с более низким приоритетом, а UDP может использоваться для высокоскоростных действий. Интересно также отметить, что с IPv6 есть новые доступные опции (которые не доступны с IPv4), которые могут удовлетворить потребности игр в реальном времени, но при этом не быть подключенными по своей природе, но я думаю, что это займет некоторое время до IPv6 может использоваться в играх без необходимости полагаться на IPv4 (это прискорбно, поэтому мы пока обходимся с IPv4 как можно лучше).
Рэндольф Ричардсон