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

Networking 我们如何反向观看多人游戏重播?,networking,data-structures,Networking,Data Structures,我们正在开发一款支持重播的多人游戏。回放的工作原理如下: 来自服务器的所有状态更新都会保存到一个文件中。当我们重放文件时,我们只需要从服务器接收初始状态并应用状态更新。这个很好用。我们可以玩,快进,暂停,然后继续。。。哦,等等 什么才是真正允许玩家向后观看重播的最佳方式 在一些实现细节中,我们使用了一个巨大的状态结构(嗯,不是真的,但您可以这样看)。通过计算上次发送的结构与当前结构之间的差异,通过网络(UDP)更新此结构。客户端在最后两个接收到的结构之间进行插值,并在需要时进行外推(当ping

我们正在开发一款支持重播的多人游戏。回放的工作原理如下:

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

什么才是真正允许玩家向后观看重播的最佳方式


在一些实现细节中,我们使用了一个巨大的状态结构(嗯,不是真的,但您可以这样看)。通过计算上次发送的结构与当前结构之间的差异,通过网络(UDP)更新此结构。客户端在最后两个接收到的结构之间进行插值,并在需要时进行外推(当ping>限制更新时)。此外,我们使用acked事件系统来处理屏幕上没有平滑绘制但需要确认的内容。

一些建议(假设您可以在任意点创建快照,并且存储正向增量)

一,。。如果回放时间短,并且状态不是太大,则实际为序列中的每个帧生成快照,并反向“渲染”它们

二,。。如果整个状态非常大,则仅为反向回放的最后一帧生成快照。然后对快照应用X个正向增量,以生成反向回放的第一帧。渲染那个。然后应用X-1增量,并进行渲染,在回放结束时(仅第一个快照)重复,直到X=0

//反向播放的伪代码
first,last=GetReplayRange();
如果(反向播放){
游戏状态快照=生成快照(第一个);
配子状态当前状态;
当前帧=最后一帧;
while(当前帧!=第一个){
//从快照循环到当前帧
对于(i=第一个;i
3。。如果将X更新应用于快照以“倒带”太慢,则将一系列快照相隔N帧,并在较窄的范围内在#2中执行相同的反转技巧


请记住,即使你有一个反转的游戏状态准备好渲染,你仍然必须以反转的方式渲染所有效果,而大多数效果系统可能不适合这种情况。

你能计算最后一个状态,然后将其视为初始状态,以前一个状态作为最新状态吗?也许我误解了这个问题。你是在每个帧中存储整个状态还是在每个状态之间存储增量?
// 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--;
  }
}