使用协议缓冲区的delta压缩

时间:2011-08-24 03:23:22

标签: c# protocol-buffers

我正在研究一个多玩家fps,我正在考虑如何对游戏状态对象执行增量压缩。

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

1 个答案:

答案 0 :(得分:1)

你有两个选择。

  • 您可以序列化状态A和状态B并在结果上运行差异。 (正如你所描述的那样)。

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

归结为此 - 以这样的方式定义数据的结构:获取delta比运行通用差异更快?

我相信它经常是。让我们举一个简单的例子。我们的游戏世界在游戏状态被定义为P1(x,y,z)和P2(x,y,z)的任何时间点定义了两个项目P1和P2(它们在世界各地运行)。因此,结构增量是6个变量之间的差异(两个参与者的x,y,z)。计算这个很快 - 它是3个数学运算。但是,谁知道这些将如何序列化 - 然后diff例程将需要做很多工作(至少一个循环)来找到结果的增量。

但它比那更好。由于您的游戏引擎知道您关心增量,因为事情会发生变化,它可以将增量存储在列表中并准备好发送增量而无需任何计算(例如,每次P移动它都会存储更改)。