Производительность WebSockets

Я думаю о внедрении HTML5 mmog, в котором участвует быстро выполняющийся объект. Игроки постоянно изменяют направление этого объекта, стреляя в него. Я думал о WebSockets и т.д. (socket.io) и холст.

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

Мои заботы состоят в том, что независимо от того, насколько быстро сервер, латентность вызовет лаг и, следовательно, убьет синхронизацию.

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

Я предполагаю, что эта проблема решена в существующих mmogs.

Любые идеи?

Ответ 1

Лучшее, что вы можете сделать в таких ситуациях: попытаться предсказать движение на стороне клиента (мертвое расчёты), а затем исправить положение/скорость с данными с сервера, если это необходимо.

Например, скажем, что ваш быстро выполняющийся объект перемещается влево по правому краю экрана со скоростью 5, и игрок стреляет в него, и он меняет направление, поэтому теперь он движется вверх по экрану с такой скоростью 5 ( 90 градусов).

Клиентское приложение, вероятно, будет обновляться гораздо чаще, чем получение данных с сервера (например, 60 обновлений в секунду на стороне клиента и 10 пакетов в секунду, полученных с сервера). Скажем, что в реальном времени объект изменил направление с 5 кадрами, оставшимися до того, как произойдет обновление сервера. На стороне клиента объект будет продолжать двигаться по своей текущей траектории, пока не получит обновление с сервера, которое изменило направление (то есть оно не просто остановится, когда оно не будет принимать данные с сервера), и в этот момент, клиент будет корректировать положение и скорость объекта.

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

У вас всегда будут ситуации, когда эти исправления окажутся довольно большими (например, у кого-то действительно плохое соединение, упавшие пакеты, высокая латентность и т.д.). Что, когда вы получаете сумасшедшие аномалии, люди обычно называют лаг в онлайн-играх, например, когда объект пропускает большие расстояния или очень быстро двигается, чтобы "догнать", где он должен быть. Просто невозможно синхронизировать все 100% на 100%. Все, что вы можете сделать, это сделать действительно хорошие догадки о том, где все должно быть.

Вот несколько статей с более подробной информацией, удачи!

http://gmc.yoyogames.com/index.php?showtopic=415538 http://www.gamasutra.com/view/feature/3230/dead_reckoning_latency_hiding_for_.php

Ответ 2

Сервер - это подходящее место для синхронизации всех ваших событий. Вы не хотите, чтобы каждый игрок отправлял свои входные данные другим игрокам "n", поскольку он создает слишком много путей связи.

Сервер будет брать данные игрока и определять новую траекторию движущегося объекта, а затем отправлять обновления каждому игроку. Это можно сделать в фиксированных единицах времени виртуальной игры, которые я буду называть "тиками".

С точки зрения сервера это дает вам следующий цикл:

  • Получить входные данные от игроков
  • Обновить состояние игры
  • Распределить изменения состояния игры игрокам

Вам нужно будет иметь дело с такими случаями, как не получать входные данные от игроков в течение определенного промежутка времени (например, возможно, игнорировать этого игрока для этого кадра).

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

Когда обновление получено от сервера для текущего тика игры, необходимо применить новое игровое состояние.

Если новая реальная позиция объекта очень близка к позиции, которую вы экстраполировали, вы можете просто установить новую позицию и отобразить ее в следующем кадре.

Если новая позиция находится "далеко" от экстраполированного положения, вам нужно решить, нужно ли мгновенно деформировать объект в пункт назначения или сделать какое-то ускоренное или линейное движение, чтобы переместить его туда в течение короткого периода времени.