После прочтения UDP еще лучше, чем TCP для игр с большим объемом данных в реальном времени? Мне интересно, имеет ли смысл использовать одновременно TCP и UDP, но для разных вещей:
TCP для отправки информации, которая отправляется нечасто, но должна быть гарантированно надежно доставлена.
Такие как обновления счета, имя игрока или даже состояние включения / выключения света в игровом мире.UDP для передачи информации, которая постоянно обновляется и может время от времени теряться, поскольку новая информация всегда в пути.
Например, положение, вращение и т. Д.
Это разумная идея? Каковы возможные недостатки?
Есть ли лучшие способы справиться с этим?
networking
multiplayer
udp
gandalf3
источник
источник
Ответы:
Это приводит к потере пакетов для UDP из-за конфликта между двумя протоколами - помните, что UDP не гарантирует доставку, в то время как TCP есть. Больше пакетов TCP будет проходить, пока UDP страдает - TCP вызывает потерю пакетов UDP . Была также (историческая) идея, что инфраструктура маршрутизаторов предпочитает TCP по UDP, хотя я сомневаюсь, что это верно на этом позднем этапе.
Я думаю, что вам лучше найти один из UDP-протоколов, ориентированных на соединение, который предназначен для использования в играх и т. П., Который предлагает вам некоторые преимущества TCP без каких-либо его недостатков. Есть несколько таких, обычно с техническим документом, детализирующим каждую концепцию.
Примером этого является библиотека Enet с открытым исходным кодом , ее основной функцией является дополнительная надежная, упорядоченная доставка пакетов по UDP.
источник
Вот цитата Сэма Янсена из комментария на gafferongames.com :
В статье Характеристики потери пакетов UDP: влияние трафика TCP получил свои результаты, открыв сразу несколько соединений TCP и наполнив сеть данными. Это приводит к перегрузке, сопровождаемой глобальной синхронизацией , которая вызывает потерю пакетов. Очевидно, что игровой клиент не откроет сразу дюжину соединений и не наполнит сеть данными, поэтому ваши результаты будут другими.
Чтобы ответить на ваш вопрос:
Да, это приемлемо, если вы не выходите за пределы полосы пропускания.
При использовании как TCP, так и UDP, вы всегда должны отдавать как можно больше по UDP и как можно меньше по TCP.
Теперь я спрашиваю вас: действительно ли необходимо отправлять счет, имя игрока и состояние индикатора по TCP? Хотя это правда, что вам нужно в конечном итоге получить эти данные, правда ли, что вам нужно получать эти данные строго по порядку и ровно один раз?
Возможно нет.
UDP отлично работает для этих случаев, и Quake 3 является хорошим примером того, как это сделать.
Так что же тогда является хорошим примером TCP наряду с UDP? Ну, подумайте о игровом чате. Обновления для этого чата (то есть новые строки текста) необходимо отправлять как надежно, так и строго по порядку. Таким образом, TCP хорошо подходит.
источник
Это разумная идея?
Каковы возможные недостатки?
Есть ли лучшие способы справиться с этим?
источник
Существует дополнительное ограничение ресурса для рассмотрения. Большинство реализаций (я верю всем, но не имею ссылки) TCP на сервере имеет ограничения на количество одновременных TCP-соединений, которые сервер может открыть одновременно. Это ограничило бы количество игроков, которые вы можете открыть одновременно, если каждому игроку нужно свое собственное соединение.
Пределы определяются настройками в сетевой системе. Кроме того, каждое соединение использует некоторую память, которая должна поступать откуда-то на сервере.
Одно из решений - открыть временное TCP-соединение только во время передачи данных и немедленно закрыть его. Это замедлит транзакции, открытие tcp-соединения - довольно «дорогой» процесс. Как всегда, это все о разработке надежной системы с самого начала, чтобы обеспечить большой рост.
источник