Как синхронизировать игровые сервисы в режиме реального времени

Я разрабатываю онлайн-версию популярной игры Pong с использованием Libgdx. Я начал использовать услугу Google Realtime Multiplayer для отправки игровых данных между игроками, но я не могу понять, как решить проблему синхронизации, с которой я сталкиваюсь.

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

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

Ответ 1

Нет однозначного ответа на этот вопрос, но существуют различные стратегии, которые люди приспосабливают для решения этой ситуации.

Переход от использования протокола UDP (если вы используете связь на основе сокетов, о которой я вам порекомендую, потому что каждый вопрос имеет значение в играх в реальном времени.Я думаю, что google api имеет UDP, который является ненадежным обменом сообщениями.И снова у меня нет опыта работы с google-realtime- api) для обмена сообщениями с интерполяцией, мертвым расчетом, прогнозами на стороне клиента и т.д. всего лишь немного.

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

  • Используемый протокол UDP для отправки движений на сервер.
  • Я сохраню две записи на стороне клиента для игрока. Один - это текущее значение, а одно значение - значение. Затем я умножу текущее значение с коэффициентом сглаживания, например, 0.3f, до момента, когда он не будет равен установленному значению. (Это помогает уменьшить колебания)
  • Я бы отправил важные сообщения через TCP.

То, что я упомянул, описывает то, что я сделал в своей игре, но можно использовать в любом. Хотя я бы предложил вам прочитать статьи на этом сайте под названием Gaffer on Games

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

Ответ 2

Вам нужно использовать некоторый тип Animation Interpolation, который будет означать, что весло не "телепортируется" в новую позицию, но медленно начинает двигаться туда после получения новой позиции.