数据增量的计算

时间:2012-05-13 19:50:40

标签: math interpolation delta

我正在编写一个服务器,每300毫秒向客户端发送一个游戏对象的“坐标缓冲区”。但我不想每次都发送完整的数据。例如,假设我有一个包含随时间变化的元素的数组:

0  0 100 50 -100 -50   at time t  
0 10 100 51 -101 -50   at time t + 300ms

您可以看到只有2 nd ,4 th 和5 th 元素发生了变化。

发送不是所有元素的正确方法是什么,而只发送delta?理想情况下,我想要一个第一次返回完整数据的函数,并在没有更改时清空数据。

感谢。

2 个答案:

答案 0 :(得分:1)

您是希望优化效率,还是这是一项学习练习?一些想法:

  • 除非有 lot 数据,否则每次发送所有数据可能最简单,效率也不是非常低效。

  • 如果您每次都为所有数据点发送增量,那么通过为未更改的点发送零而不是重新发送先前的值,您将无法节省太多。

  • 如果仅为那些更改的点发送数据,则需要为每个值提供索引。例如,如果第3点增加5而第8点减少2,则可以发送3 5 8 -2。但现在,由于您为每个发生变化的点发送了两个值,只有少于一半的点变化,您才会获胜。

  • 如果值的变化相对较慢,与传输更新的速率相比,您可以通过传输每个数据点的增量来提高效率,但只使用几位。例如,使用4位,您可以将值从-8传输到+7。只要增量从不大于增量,或者在它们“赶上”实际值之前传输几个增量就可以了。

  • 有两种不同的机制可能不值得:一种是发送初始值,另一种是发送增量。如果你能够容忍滞后,那么为每个点假设一些恒定的初始值更有意义,然后只传输增量。

答案 1 :(得分:0)

有很多选择。如果大多数数据没有变化,只需发送已更改元素的(索引,值)对。如果大多数值发生变化但变化很小,则计算增量和gzip(或运行长度编码,或许多其他可能性)结果。