Как мы можем просмотреть переигровку многопользовательской игры в обратном порядке? - PullRequest
2 голосов
/ 21 ноября 2011

Мы создаем многопользовательскую игру, которая поддерживает повторы.Повторы работают следующим образом:

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

Как лучше всего позволить игрокам просматривать переигровку назад?


НекоторыеВ деталях реализации мы используем огромную структуру состояний (ну, не совсем, но вы можете видеть это как таковой).Эта структура обновляется по сети (UDP) путем вычисления различий между последней отправленной структурой и текущей.Клиент интерполирует между двумя последними полученными структурами и экстраполирует при необходимости (когда ping> throttle of updates).Кроме того, мы используем проверенную систему событий для вещей, которые не должны быть гладко нарисованы на экране, но должны быть, ну, в общем, проверены.

1 Ответ

1 голос
/ 21 ноября 2011

Пара предложений (при условии, что вы можете сделать моментальный снимок в любой момент, и вы сохраняете дельты вперед).

1 .. Если воспроизведение короткое, а состояние не слишком большое,фактически генерировать снимки для каждого кадра в последовательности и «рендерить» их в обратном порядке.

2 .. Если все состояние очень большое, генерировать снимок только для последнего кадра обратного воспроизведения.Затем примените X вперед дельты к снимку, чтобы создать первый кадр обратного воспроизведения.Визуализируйте это.Затем примените дельты X-1 и визуализируйте их, повторяя до X = 0, когда вы находитесь в конце воспроизведения (только первый снимок).

// pseudo code for reverse play
first, last = GetReplayRange();

if (playReversed) {
  GameState snapShot = GenerateSnapshot(first);
  GameState currentState;

  currentFrame = last;
  while (currentFrame != first) {
    // loop from snapshot up to current frame
    for (i = first; i < currentFrame; i++) {
      currentState = snapShot.AddDetlasTo(currentFrame);
    }
    Render(currentState);
    currentFrame--;
  }
}

3 .. Если это слишком медленночтобы применить X-обновления к снимкам для «перемотки», а затем сделать серию снимков с N-кадровым интервалом и выполнить тот же обратный трюк в # 2 в более узком диапазоне.

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

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