Что следует использовать для MMO-игры на java. UDP или TCP? И почему? TCP представляет собой двухточечную связь и передает каждый пакет, в то время как UDP не имеет двухточечной связи и может отбрасывать пакеты, что приводит к задержке. Какой из них лучше использовать в этом сценарии?
Что было бы лучше в Java для работы в сети? UDP или TCP?
Ответы (5)
Ответ зависит не от языка, а от требований игры.
Если ваша игра может справиться с обновлениями статуса от игроков (или сервера), которые либо пропадают, либо прибывают не по порядку, тогда UDP подойдет.
Если вам нужен ответ в реальном времени с минимальной задержкой (и вышеупомянутые проблемы решены), вам также следует использовать UDP.
В противном случае следует использовать TCP.
Неважно, Java это или нет, TCP и UDP имеют одни и те же преимущества и недостатки, которые не зависят от языка.
Но чаще всего это сводится к одному основному вопросу проектирования: что должно произойти, когда пакет отбрасывается?
- Притворись, что этого не было. Это территория UDP.
- Подождите, пока пакет не будет отправлен повторно. Здесь следует использовать TCP.
Ни один из подходов не является правильным или неправильным сам по себе, оба вызовут проблемы в вашей игре, но это вопрос, на который вы должны ответить в первую очередь.
Вопрос на самом деле не связан с Java. Не гарантируется, что дейтаграммы UDP достигнут пункта назначения, в отличие от дейтаграмм TCP. Последовательные дейтаграммы UDP также могут достигать места назначения не по порядку. Например, DNS основан на UDP, потому что запросы и ответы принимают только одну дейтаграмму. Если вам нужна надежность и вы не хотите осуществлять повторные попытки. TCP - ваш выбор. В настоящее время накладные расходы на вычисления минимальны, поэтому я не думаю, что от предпочтения UDP можно ожидать большого увеличения производительности.
Мой опыт работы с UDP и TCP выглядит следующим образом:
- UDP значительно быстрее. мы говорим на 2 порядка.
- В проводных сетях потеря пакетов UDP составляет менее 1%.
- В беспроводной сети потеря пакетов UDP может легко достигать 80%, и физическое расстояние до маршрутизатора имеет значение: вы потеряете 20% пакетов с расстояния в 30 см и 50% с расстояния 20 футов.
Так что UDP хорош для несущественных вещей. Например, если в вашей игре бегают 2 парня, и игрок A получает текущие координаты и скорость игрока B через UDP каждые 100 миллисекунд, игрок A может на некоторое время экстраполировать, не заходя слишком далеко. С другой стороны, если у игрока A фулл-хаус, а у игрока B - флеш-рояль, ситуация иная.
В своем проекте я использовал UDP в качестве основной схемы связи, при которой каждый получатель отправлял уведомление. Если связь прерывалась дольше X, я прибегал к TCP.