Подтвердить что ты не робот

Как синхронизировать физику в многопользовательской игре?

Я пытаюсь найти лучший способ сделать это, рассматривая чересстрочную кросс-платформенную игру на мобильной (3G-полосе) с помощью снарядов и падающих блоков.

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

Другой метод должен состоять в том, чтобы отправить физические данные (force, acceleration...) и запустить физику на другом устройстве, но я боюсь никогда не иметь того же результата вообще.

4b9b3361

Ответ 1

Моя текущая реализация работает следующим образом:

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

Это для меня работает неплохо. У меня есть физическая система, работающая над десятками подсистем (карт).

Некоторые ключевые моменты моей реализации:

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

Все это отправляется через UDP. Это было бы ужасно для TCP.

Ответ 2

Вы хотите отправить абсолютные позиции и вращения.

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

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

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