Как синхронизировать игровые сервисы в реальном времени с мультиплеером
Я занимаюсь разработкой онлайн-версии популярной игры Pong с использованием Libgdx. Я начал использовать многопользовательский сервис Google Realtime для передачи игровых данных между игроками, но я не могу понять, как решить проблему синхронизации, с которой я столкнулся.
Информация, отправляемая в данный момент, является веслом игрока, поэтому, когда я двигаюсь, я отправляю свою новую позицию противнику. В тот момент, когда противник его получает, время уже прошло и синхронизация потеряна.
Я понимаю, что, возможно, должно быть некоторое время ожидания между движениями с использованием самой медленной связи, но как мне сделать так, чтобы это выглядело гладко?
2 ответа
На этот вопрос нет однозначного ответа, но есть разные стратегии, которые люди адаптируют для решения этой ситуации.
Переход от использования протокола UDP (если вы используете сокетную связь, которую я рекомендую вам, потому что каждая мс имеет значение в играх реального времени. Я думаю, что в Google API есть UDP, который является ненадежным обменом сообщениями. Опять же, у меня нет опыта работы с Google-Realtime-API) для обмен сообщениями с интерполяцией, точный расчет, предсказания на стороне клиента и т. д.
Это очень обширная тема, чтобы ответить здесь. Когда я создавал свою многопользовательскую танковую игру, я сделал несколько вещей, чтобы все выглядело немного плавнее.
- Используется протокол UDP для отправки движений на сервер.
- Я оставлю две записи на стороне клиента для игрока. Один - это текущее значение, а другой - значение, которое нужно установить. Затем я умножу текущее значение на коэффициент сглаживания, например, 0,3f, пока время не станет равным значению, которое нужно установить. (Это помогает уменьшить дрожание)
- Я бы отправил важные сообщения через TCP.
Пункты, которые я упомянул, описывают то, что я делал в своей игре, но может использоваться в любом. Хотя я бы посоветовал вам прочитать статьи на этом сайте под названием Gaffer on Games
Опять же, эта область огромна, и никакой ответ не может вам помочь. Я сделал свою диссертацию на эту тему и до сих пор не могу дать вам окончательный ответ. Вам нужно будет прочитать много статей и смоделировать то, что вы изучаете, в соответствии с вашими потребностями.
Вам нужно использовать какой-то тип Animation Interpolation
Это означает, что весло не "телепортируется" в новую позицию, а медленно начинает двигаться после получения новой позиции.