我正在研究多人 fps,我正在考虑如何对游戏状态对象执行增量压缩。
在阅读 Q3 如何进行联网时,我认为增量压缩可以通过将对象序列化为二进制状态然后仅在最后一个已知的接收对象和当前对象之间发送二进制差异来实现。这是处理增量压缩的正确方法吗?
最佳答案
那么你有两个选择。
- 您可以序列化状态 A 和状态 B 并对结果运行差异。 (如您所述)。
或
- 您可以利用结构知识找出状态 A 和状态 B 之间的差异,并将结构差异序列化。
这归结为 - 数据结构的定义方式是否使获取增量比运行通用差异更快?
我相信它经常是。让我们举一个简单的例子。我们的游戏世界在游戏状态定义为 P1(x,y,z) 和 P2(x,y,z) 的任何时间点定义了两个项目 P1 和 P2(它们在世界各地运行)。因此,结构增量是 6 个变量(两个玩家的 x、y、z)之间的差异。计算起来很快——它是 3 个数学运算。然而,谁知道这些将如何序列化——然后 diff 例程将不得不做很多工作(至少一个循环)来找到结果的增量。
但它比那更好。由于您的游戏引擎知道您在事情发生变化时关心增量,因此它可以将增量存储在列表中并准备好发送增量而无需任何计算(例如,每次 P 移动时它都会存储更改)。
关于c# - 使用 Protocol Buffer 的增量压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7170083/