Принципы многопользовательской игры в реальном времени для Node.js

12

Я читал статью Valve о многопользовательских сетях, которая была адаптирована из статьи Яна Бернье 2001 года « Методы компенсации задержки» в разработке и оптимизации внутриигрового протокола клиента / сервера . Я делаю многопользовательскую игру в реальном времени, используя сервер node.js, подключенный к клиентам через socket.io, и у меня есть несколько вопросов относительно принципов, подробно описанных ниже:

Интерполяция сущностей

[Интерполяция] предотвращает дрожание движения, к которому это обычно приводит, буферизируя обновления сервера, а затем воспроизводя их с промежутками, плавно интерполируемыми между ними. Он также может защитить от сбоев, вызванных потерей пакета.

Прогнозирование на стороне клиента

Предсказание - это понятие клиента, предсказывающее последствия действий локального игрока, не дожидаясь, пока сервер подтвердит их. Предсказанное состояние объекта проверяется на соответствие серверным командам до тех пор, пока не будет обнаружено совпадение или несоответствие.

Компенсация отставания

Компенсация запаздывания - это понятие сервера, использующего задержку игрока для перемотки времени при обработке [ввода пользователя], чтобы увидеть то, что увидел игрок при отправке команды. В сочетании с прогнозированием, компенсация задержки может помочь в борьбе с задержкой в ​​сети до такой степени, что почти исключает ее с точки зрения злоумышленника.

  • Применяются ли принципы к TCP так же, как к UDP, и будут ли какие-либо различия в реализации? Я могу видеть, что интерполяция объекта не должна была бы защищать от потери пакета, но это об этом.

  • Могу ли я даже общаться между сервером и веб-браузером и наоборот, используя UDP и Node.js?

  • Поскольку работе уже более десяти лет, эти принципы все еще используются или появились другие технологии?

Любая помощь приветствуется.

Йошима
источник
1
На самом деле вам не нужен UDP для многопользовательских игр, вопреки распространенному мнению. Учитесь у лучших; WoW использует TCP, и я полагаю, что многие другие многопользовательские игры AAA делают. Люди просто следуют чьим-то советам, а затем проводят следующие 5 месяцев, внедряя плохую и медленную версию TCP!
Jcora
1
(Если, конечно, вы не уверены, что обладаете знаниями и ресурсами для разработки достойного протокола поверх UDP, который мог бы использовать его преимущества.)
jcora
1
Ни одна игра AAA FPS не использует TCP. Это действительно слишком медленно для игр, которые требуют обновления в реальном времени. Но так как он не пишет экшн-игру, он должен уйти с TCP.
Брендан Лесняк
@Yannbane Не знал, что WoW использует TCP. Похоже, что многие ММО делают, из того, что я мог найти. Я уверен в себе в написании многопользовательских игр на HTML5. Благодарность!
dreta

Ответы:

6
  • Принципы уменьшения влияния лагов одинаковы независимо от транспортного протокола. Потеря пакетов - это еще одна тема - для многих видов пакетов потеря некоторых не является критичной, потому что следующее обновление, вероятно, уже в пути - здесь UPD имеет преимущество, но когда вам нужно убедиться, что определенный пакет доставлен, вам нужны пользовательские код подтверждения, чтобы сделать это с UDP
  • Node.js поддерживает UDP, а веб-браузеры - нет (без плагинов). Лучший способ взаимодействия между ними в режиме реального времени - это веб-сокеты, которые в основном являются TCP. Но для общения вы можете использовать Socket.IO, который предоставляет запасные варианты для браузеров, которые не поддерживают веб-сокеты.
  • Принципы остаются прежними.
Тапио
источник
1
Я думаю, что это устарело - WebRTC должен быть способом использовать UDP-подобную связь, не так ли?
Николай Ценков
4

Вы должны проверить эту статью о многопользовательских играх в реальном времени в HTML5, опубликованную на сайте buildnewgames.com Свеном Бергстромом, он рассказывает о тех же вещах и использует Node.JS. У меня что-то подобное происходит самому. Я только сейчас исследую больше о предсказании и интерполяции на стороне клиента и тому подобное, прежде чем пытаться решить остальную часть этого.

Я считаю, что это определенно возможно сделать с помощью Socket.IO и Node, однако технология все еще нова, поэтому в руководстве по внедрению будет мало документации и практически ничего. Я бы порекомендовал делать то, что я делаю, и изучать предмет очень подробно в абстрактных терминах высокого уровня, а затем попытаться реализовать это самостоятельно.

Кори Гросс
источник
1

Я считаю, что технология почти такая же. Кроме того, понятия не зависят от того, какой язык вы используете или используете ли вы UDP или TCP. Я написал очень подробное объяснение всего этого здесь http://www.gabrielgambetta.com/fpm1.html , включая симпатичные диаграммы :)

ggambett
источник