我们如何反向观看多人游戏重播?

时间:2011-11-20 23:18:16

标签: networking data-structures

我们正在构建支持重播的多人游戏。重播的工作方式如下:

服务器的所有状态更新都会保存到文件中。当我们重放文件时,我们只需从服务器接收初始状态并应用状态更新。这很好用。我们可以玩,快进,暂停和去...哦等等。

实际上允许玩家向后查看重播的最佳方式是什么?


一些实现细节,我们使用一个巨大的状态结构(好吧,不是真的,但你可以这样看)。通过计算最后发送的结构与当前结构之间的差异,可以通过网络(UDP)更新此结构。客户端在最后两个收到的结构之间进行插值,并在需要时进行推断(当ping>更新时)。此外,我们使用一个acked事件系统来处理那些无法在屏幕上顺利绘制的东西,但是需要这样做。

1 个答案:

答案 0 :(得分:1)

一些建议(假设您可以在任何时候制作快照,并且您正在存储前向增量)。

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中执行相同的反向操作,范围更窄。

请记住,即使你有一个可以渲染的逆转游戏状态 - 你仍然需要反向渲染所有效果,大多数效果系统可能都不适合。