Как синхронизировать физику в многопользовательской игре? - PullRequest
13 голосов
/ 30 ноября 2011

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

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

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

Ответы [ 2 ]

9 голосов
/ 24 декабря 2011

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

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

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

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

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

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

6 голосов
/ 05 декабря 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...