使用协议缓冲区的增量压缩

本文关键字:压缩 缓冲区 协议 | 更新日期: 2023-09-27 18:06:25

我正在制作一款多人fps游戏,我正在思考如何对游戏状态对象执行增量压缩。

在阅读关于Q3如何进行网络连接时,我认为增量压缩可以通过将对象序列化为二进制状态,然后只发送最后已知接收对象和当前对象之间的二进制差异来实现。这是处理增量压缩的正确方法吗?

使用协议缓冲区的增量压缩

你有两个选择。

  • 您可以序列化状态A和状态B,并对结果运行diff。(如你所述)

  • 可以利用结构知识找到状态A和状态B之间的差异,并序列化结构差异。

这归结为——数据结构的定义方式是否使得取delta比运行通用diff更快?

我相信它经常是。让我们举一个简单的例子。我们的游戏世界定义了两个道具P1和P2(它们绕着世界运行),在任何时间点,游戏状态都被定义为P1(x,y,z)和P2(x,y,z)。因此,结构增量是6个变量(两个玩家的x,y,z)之间的差异。计算起来很快,只需要3次数学运算。然而,谁知道这些将如何序列化——然后diff例程将不得不做大量的工作(至少一个循环)来找到结果的增量。

但它甚至比这更好。因为你的游戏引擎知道你关心事物变化时的增量,所以它可以将增量存储在列表中,并准备发送增量而无需任何计算(例如每次P移动时它都会存储变化)。