Networking 实时多人游戏(概念问题)

Networking 实时多人游戏(概念问题),networking,compression,real-time,multiplayer,Networking,Compression,Real Time,Multiplayer,我一直在读Valve,它似乎解释了他们多人游戏系统的架构。看起来它们在客户端上延迟了几次渲染,以便处理丢弃的数据包,但它们也将数据包作为“增量快照”(两个相邻状态之间的差异)发送 假设我们有时间A、B、C,客户机在时间A是正确的,但在B丢弃数据包,然后在C接收数据包。它如何正确推断时间C的状态?C处的数据包只告诉(我想)状态B和C之间的增量,客户端只知道A处的状态。我在这里遗漏了什么?我猜每隔一段时间他们就会发送一个完整的快照。这就是为什么laggy游戏需要人们在丢失增量帧时以错误的速度运行,然

我一直在读Valve,它似乎解释了他们多人游戏系统的架构。看起来它们在客户端上延迟了几次渲染,以便处理丢弃的数据包,但它们也将数据包作为“增量快照”(两个相邻状态之间的差异)发送


假设我们有时间A、B、C,客户机在时间A是正确的,但在B丢弃数据包,然后在C接收数据包。它如何正确推断时间C的状态?C处的数据包只告诉(我想)状态B和C之间的增量,客户端只知道A处的状态。我在这里遗漏了什么?

我猜每隔一段时间他们就会发送一个完整的快照。这就是为什么laggy游戏需要人们在丢失增量帧时以错误的速度运行,然后在出现完整快照时“传送”到正确的位置。

定期或根据客户端请求同步完整状态。/可用于补偿等待完整位置更新时的数据包丢失。某些事件需要可靠的交付,并且可以添加确认接收的方法

格伦·费德勒有一些关于网络游戏的资料


听起来很像。增量状态表示从上次收到的客户端确认状态所做的更改。因此,如果服务器看到客户机落后,那么将根据客户机状态和当前服务器状态之间的差异创建下一个增量。

不看实现,我可以想象数据包C还包括它来自增量的数据包的id(在本例中,数据包B)


当客户端在数据包A之后收到数据包C时,它将知道它还没有看到数据包B,因此可以请求服务器进行完整更新。

来自链接文章:

通常,完整(非增量)快照仅在游戏开始或客户端遭受几秒钟的严重数据包丢失时发送。客户端可以使用cl_fullupdate命令手动请求完整快照


服务器可能会定期发送完全同步(即不是增量),但频率较低。这就是我正在做的,至少。

增量不必与之前发送的消息相关(通过增量或快照)。相反,它们将是相对于最后一个被承认的状态的。因此,在上面的示例中,C处的更新可能是相对于a的增量。因此,丢失消息B会带来不便,因为增量越来越大(并且可能会累积错误),但最终消息将通过并得到确认,服务器可以开始发送相对于该更新状态的增量。

Yeah,但是这里说的是“几秒钟内的严重数据包丢失”。没有一个数据包丢失,它明确表示它可以恢复。这不是假设delta B与delta C具有相同的内容吗?它是delta来源的数据包的id或序列号,或者其他一些简单的方法来跟踪数据包的顺序……嗯,数据包通常有一个时间戳和一个序列号。它使丢失的数据包之间的精确插值成为可能。但是文章说,“…如果快照[B]由于数据包丢失而丢失,插值甚至可以工作”-这似乎表明它不需要只丢失一个数据包的完整更新。是的。我确信这个增量足够小,这样插值就可以了。那就不那么准确了。他们可能还使用基于对象可能投影路径的预测算法来“合成”a B位置以进行插值。地震3号在这个地区做了很多事情。这不是“实时”的意思。