Как использовать веб-сокеты для игр в реальном времени - PullRequest
12 голосов
/ 20 января 2012

Я хочу сделать игру для двух игроков, которая использует websockets и сервер node.js. socket.io используется как на клиенте, так и на сервере.Пока что мой единственный опыт - создание приложения чата.

Это моя первая попытка многопользовательской игры, поэтому я не очень знаком с сетевыми играми.Должен ли сервер отслеживать:

  1. Каждую позицию, в которой находится мяч, и как часто или когда?
  2. движение игрока, игрок двигается влево или вправо, что если я нажимаю и удерживаюкакое-то время, как мне справиться с этим?Должен ли я отправить как pressHoldStartPosition и pressHoldStopPosition?Я думаю, это легко, если я позволю только нажимать, но не удерживать.

Мои мысли:

  1. Когда мяч попадает в игрока, клиент рассчитывает скорость, старт иконечная позиция и другой клиент должен выполнить правильную анимацию из этого.
  2. Не знаю.

Ответы [ 3 ]

13 голосов
/ 28 января 2012
  1. Клиенты ничего не рассчитывают, если только вы не хотите, чтобы они предсказывали следующий игровой шаг * (ответ сервера). Вся игра работает на сервере, который является единственным надежным источником данных и расчетов. В играх типа понг, где меньше 10 объектов, вы можете отправлять данные довольно часто (с интервалом 50 мс). Для шара я бы отправил [x, y, скорость или угол], для весла [x, y]. Затем интерполируйте (анимируйте по времени - 50 мс) между старым (x, y на клиенте) и новым (x, y, который вы только что получили с сервера).

  2. Не отправляйте миллионные копии - игрок нажал - скорее отправляйте по одному пакету каждый период времени (100 мс?), Содержащий информацию, такую ​​как «игрок нажимает вверх» в течение 100 мс или «положение игрока» 32, 100), затем проверьте на стороне сервера, возможно ли это перемещение, и примите его или отклоните.

Может быть, эта тема поможет вам в приключениях:

Многопользовательская JavaScript-игра с Node.JS - Разделение игроков

[* 1] preditction - это механизм компенсации задержки, который вы можете реализовать позже. Упрощенно это означает, что сервер и клиент совместно используют некоторый код игровой логики, а когда у клиента нет текущих данных с сервера, он пытается имитировать то, что происходит в реальной игре.

2 голосов
/ 20 января 2012

Существует сайт обмена стеками, посвященный разработке игр: https://gamedev.stackexchange.com/

Рекомендуется отправлять только те обновления, о которых клиенты должны знать.Кроме того, как правило, вы отправляете результат действий пользователя, а не сами действия.Вещи, которые можно вычислить (физику), отправлять не нужно, за исключением периодических точек синхронизации, чтобы учесть ошибки с плавающей запятой, которые накапливаются со временем, и синхронизировать с действиями удаленного пользователя.Это также делает игру более интерактивной и покрывает некоторые проблемы, связанные с задержкой и дрожанием сети.

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

2 голосов
/ 20 января 2012

Вы найдете книги, книги, игровые сети.

В кратком описании я нашел интересную реализацию: Сервер и клиент рассчитывают физику игры. Сервер будет ведущим и будет иметь правильное состояние всех объектов, в то время как клиент будет пытаться «предсказать» состояние объектов и поддерживать плавную анимацию. Клиент будет периодически обновлять правильное состояние сущностей с сервера. В некоторых играх вы можете видеть, что сущности внезапно телепортируются, потому что предсказанная клиентом позиция не соответствует фактической позиции сервера.

Состояние объекта, например мяч или игроки, обычно содержит такую ​​информацию, как позиция, скорость, состояние кнопки (нажатие клавиши / нажатие вверх).

Кроме того, это дает волю воображению, тестирование на лучшее решение и поиск того, что работает. Есть много моментов, которые необходимо учитывать, такие как задержка проигрывателя и пропускная способность.

...