В настоящее время я работаю над многопользовательской онлайн-игрой в режиме реального времени. Цель состоит в том, чтобы иметь соединение клиент / сервер с использованием протокола UDP. До сих пор я использовал UDP для движений игроков и TCP для событий (стрельба игрока, проигрыш игрока), потому что я должен быть уверен, что такие данные будут поступать всем игрокам, подключенным к серверу. Я знаю, что UDP называется «ненадежным», и некоторые пакеты могут быть потеряны. Но я читал везде, чтобы никогда не смешивать TCP и UDP, потому что это может повлиять на соединение.
Главный вопрос: как мне организовать свою сеть?
UDP не имеет соединения, как мне сохранить кто есть кто? Должен ли я сохранить IP-адреса клиентов в списке?
Должен ли я использовать TCP для важных событий или использовать UDP? Если мне нужно использовать UDP, как я могу убедиться, что данные не будут потеряны?
Используя TCP и UDP, мне нужно сохранить для каждого игрока их IP в списке (для UDP) и TcpClient, который подключен в другом списке (для UDP). Как я могу изменить это, чтобы быть более эффективным?
источник
Ответы:
UDP имеет меньше накладных расходов, но за счет потери пакетов, не зная об этом (часть накладных расходов с TCP обеспечивает повторную отправку потерянных пакетов).
Однако большая проблема с использованием UDP состоит в том, что существует много сайтов, которые блокируют весь трафик UDP (за исключением DNS), потому что многие администраторы считают, что это хорошая практика безопасности.
Кроме того, не думайте, что у каждого из ваших игроков будет свой IP-адрес - во многих ситуациях несколько пользователей используют одно и то же подключение к Интернету, и если школьники подсели на вашу игру, вы можете поспорить, что они, вероятно, собираюсь выяснить, как установить и запустить его во время занятий вместо того, чтобы выполнять свою работу (и не хотите ли вы, чтобы они тратили это драгоценное время на вашу игру, а не на чужую?).
Когда ваш TCP-поток открыт, он все еще довольно эффективен. Следующим шагом является минимизация объема данных, которые вы отправляете / получаете, и именно здесь вступает в игру дизайн протокола. Если вы просто отправите несколько байтов для каждой команды (например, «продвинуться вперед») вместо того, чтобы, например, обернуть одну и ту же команду в сотни байтов кода XML, тогда ваше общее потребление пропускной способности сети будет ниже, и меньше циклов ЦП будет быть обязательными для обработки информации (несколько байтов легко сравниваются с разборкой, интерпретацией и проверкой синтаксиса большого фрагмента XML).
Вы, конечно, можете открывать несколько потоков TCP и использовать их для разных целей, например, один для команд, другой для передачи графики, другой для аудио-чата и т. Д. Таким образом, если вы передаете большую графику, которая занимает 5-10 секунд, чтобы скачать, по крайней мере, движения команд игрока не будут отставать, потому что они будут в другом потоке (и вы можете отобразить спрайт по умолчанию, пока не закончится загрузка нового спрайта, что всегда веселее, чем ожидание).
источник
Это не прямой ответ на ваш вопрос, но у gafferongames есть несколько действительно хороших статей о сетевых играх: http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about -game-сетей /
источник