我们正在构建支持重播的多人游戏。重播的工作方式如下:
服务器的所有状态更新都会保存到文件中。当我们重放文件时,我们只需从服务器接收初始状态并应用状态更新。这很好用。我们可以玩,快进,暂停和去...哦等等。
实际上允许玩家向后查看重播的最佳方式是什么?
一些实现细节,我们使用一个巨大的状态结构(好吧,不是真的,但你可以这样看)。通过计算最后发送的结构与当前结构之间的差异,可以通过网络(UDP)更新此结构。客户端在最后两个收到的结构之间进行插值,并在需要时进行推断(当ping>更新时)。此外,我们使用一个acked事件系统来处理那些无法在屏幕上顺利绘制的东西,但是需要这样做。
答案 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中执行相同的反向操作,范围更窄。
请记住,即使你有一个可以渲染的逆转游戏状态 - 你仍然需要反向渲染所有效果,大多数效果系统可能都不适合。