2012-03-05 2 views
1

Мы используем Corona SDK и его физический движок для перемещения объектов по ландшафту какого-то типа (например, Tiny Wings), и у нас есть вопрос относительно коррекции позиций. Скажите, что коробка перемещается вдоль холмов, но ее положение вычисляется на другом устройстве. Несколько раз каждую секунду, вы получите:Сетевая латентность в многопользовательской мобильной игре

  • обновленное положение
  • скорость коробки
  • время, в котором информация была отправлена ​​

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

Есть ли способ сказать: «Остановите все и дайте мне положение, которое будет иметь этот ящик, если бы физика действовала на него за X мс, а затем возобновила геймплей», фактически не остановив весь игровой процесс для X ms?

+0

Непонятно, что вы просите. Что означает «остановить все», если не на самом деле останавливать вещи? –

+0

Я рекомендую http://gafferongames.com/game-physics/networked-physics/, особенно обсуждение одноранговой сетевой физики в комментариях –

+0

Да, вы можете сделать тщательное физическое моделирование, чтобы определить, где, вероятно, поле теперь, основываясь на его состоянии X ms ago, и отображает это. И вы можете продлить симуляцию симуляции с течением времени и настроить ее всякий раз, когда приходит обновление.Отвечает ли это на ваш вопрос, или вам нужно больше? – Beta

ответ

0

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

Некоторые физические двигатели могут не моделировать более длительные временные интервалы должным образом, поэтому рекомендуется выполнять большее количество меньших шагов, чем один большой шаг. Поэтому в вашем случае donot делает X ms каждую итерацию, но меньше шагов, поэтому вы можете получить очень точное моделирование.

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

0

Вы задали этот вопрос 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: в этом случае вы могли бы позволить серверу решить и перепланировать еще один мкс в будущем.
Смежные вопросы