2012-03-05 2 views
2

Я разрабатываю простую быструю двухмерную многопользовательскую игру в режиме реального времени во Flash. Игроки могут только стрелять и ходить, чтобы двигаться. Я использую соединение сокетов TCP (AS3 не предлагает UDP).Компенсация латентности сетевой сети

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

Я знаю координаты вектора движения, и я могу легко интерполировать их с использованием латентности. Однако я не могу найти эффективный способ определить, сколько времени (T1) потребовалось обновление состояния для клиента client1-server-client2, а затем внести исправления в экран клиента2 на основе T1. (Знаете, времена ping могут колебаться совсем немного).

Мне нужен способ сделать вышеупомянутый, мне нужен способ, который так же быстро и точно, насколько это возможно, но не очень сложный. (какой алгоритм я должен использовать? Какое решение - временные метки, может быть, что? Я не знаю.)

+1

См. Http://gamedev.stackexchange.com/questions/552/synchronizing-clients-with-a-server-and-with-each-other и http://gamedev.stackexchange.com/questions/6645/ лаг-компенсация-с сетевыми-2D-игр –

ответ

4

Прежде всего, я думаю, что сервер должен постоянно обновлять информацию обо всем «мире». Все клиенты отправляют свои игровые действия (то есть, что делает игрок, например, движения, съемки и т. Д.) На сервер и используют сжатые данные.

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

Так что вещь:

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

Похоже Publish/Subscribe шаблон проектирования (наблюдатель), но

  • каждый клиент является издателем, а сервер является подписчиком на то, что касается изменения статуса игрока.
  • сервер является издателем, а клиенты являются подписчиками на то, что касается изменения в мире, но только для регионов, в которых заинтересован каждый игрок. Это особый наблюдатель, поскольку подписка изменяется со временем (регионами) из-за перемещения
Смежные вопросы