Компенсация задержки игровой сети - PullRequest
2 голосов
/ 05 марта 2012

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

Все, что я хочу, - это синхронизировать действия игроков, чтобы Player1 мог видеть то же на своем экране, что и Player2, Player3 ... или просто видеть близкое представление (положение, получение урона и т. Д.). * Я знаю координаты вектора движения и могу легко интерполировать их, используя задержку. Однако я не могу найти эффективный способ определить, сколько времени ( T1 ) потребовалось для обновления состояния для перемещения client1-server-client2, а затем внести исправления в экран client2 на основе T1 . (Вы знаете, время пинга может колебаться совсем немного).

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

1 Ответ

4 голосов
/ 05 марта 2012

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

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

Итак, дело в том:

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

Это похоже на шаблон проектирования публикации / подписки (Observer), но

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