Вы задали этот вопрос 20 месяцев назад, вы, вероятно, уже решили эту проблему, но я просто пытаюсь ответить на него для будущих посетителей:
Там не один лучший способ решить эту проблему, всегда есть правильность-латентность компромиссов, однако следующие некоторые мысли об этом.
В принципе нет никакой разницы между сетевой физикой и сетевой логикой, это как сетевая синхронизация. Мы можем попытаться отвлечь его, чтобы означать, что есть событие (пробел + время + состояние), на котором должны быть согласованы все сверстники. Это событие может быть определенным объектным состоянием, вычисленным физическим движком или чем-либо еще.
Вы описали, что ваши пакеты содержат определенное положение и скорость (состояние) и временную метку во время инициирования события. Каждый сверстник указывает другим сверстникам (прямому или через сервер), что соответствует его текущему состоянию.
Существует способ сделать синхронизацию, которая работает лучше (на мой взгляд): Пир не должен сказать, что его текущее состояние, но вместо того, чтобы сказать, в каком состоянии он хочет иметь объект X миллисекунды в будущем.
Двигатель должен попытаться сделать X быть как можно ближе к сумме:
- наблюдается латентный между клиентами
- немного время интерполяции
- немного безопасности margin
Примечание: он может найти наблюдаемый latenc y, постоянно отправляя сообщения и анализируя время отклика
Если латентность внезапно ухудшается, а запас прочности недостаточен, то происходит короткое замедление игры до тех пор, пока X не будет адаптирован.
моделирование превращает перемежаются и каждое событие получает объявил заранее, так что каждый клиент может получить его, добавить его в сроки, то Interpolate-и-разрешения, когда придет время.
Моделирование-поворот, который входит в X-ю миллисекунду, можно назвать целью-поворот.
(будущие читатели: обратите внимание, что имитационные повороты часто не идентичны FPS, часто они намного реже, например, каждые 10 кадров или каждые 100 мс или , и мне нравится это самое лучшее так же быстро, как сеть может доставлять)
Пример:
[Turn0] a client/physicsengine announces event e1
[Turn1] a client/physicsengine announces event e2
[Turn2] (other stuff)
[Turn3] (other stuff)
[Turn4] (other stuff)
[Turn5] clients start interpolating towards e1
[Turn6] clients start interpolating towards e2
[Turn7] e1 target-turn: e1 should be true/fulfilled now
[Turn8] e2 target-turn: e2 should be true/fulfilled now
[Turn9]
Что делать, если два клиенты не согласны о том, что определенное событие будет? Прежде всего обратите внимание, что это может быть обнаружено каждым клиентом независимо, потому что у каждого есть временная шкала, где повороты становятся согласованными до того, как они достигнут. Что делать, зависит от вашего приложения и от того, какого события это:
- Есть много событий, которые не имеют не игрового эффекта например если ваш физический движок вычислил что-то, что только для более приятной графики. Эти события можно просто забыть.
- Для других событий не имело бы значения, если одна или другая версия выполняется до тех пор, пока оба клиента согласны. Клиенты могут выбрать версию в децентрализованном режиме (без необходимости общения) на основе некоторой эвристики.
- В других случаях может случиться так, что событие A отменяет действие событий B и B делает недействительными A: в этом случае вы могли бы позволить серверу решить и перепланировать еще один мкс в будущем.
Непонятно, что вы просите. Что означает «остановить все», если не на самом деле останавливать вещи? –
Я рекомендую http://gafferongames.com/game-physics/networked-physics/, особенно обсуждение одноранговой сетевой физики в комментариях –
Да, вы можете сделать тщательное физическое моделирование, чтобы определить, где, вероятно, поле теперь, основываясь на его состоянии X ms ago, и отображает это. И вы можете продлить симуляцию симуляции с течением времени и настроить ее всякий раз, когда приходит обновление.Отвечает ли это на ваш вопрос, или вам нужно больше? – Beta