我正在编写一个服务器,每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?理想情况下,我想要一个第一次返回完整数据的函数,并在没有更改时清空数据。
感谢。
答案 0 :(得分:1)
您是希望优化效率,还是这是一项学习练习?一些想法:
除非有 lot 数据,否则每次发送所有数据可能最简单,效率也不是非常低效。
如果您每次都为所有数据点发送增量,那么通过为未更改的点发送零而不是重新发送先前的值,您将无法节省太多。
如果仅为那些更改的点发送数据,则需要为每个值提供索引。例如,如果第3点增加5而第8点减少2,则可以发送3 5 8 -2
。但现在,由于您为每个发生变化的点发送了两个值,只有少于一半的点变化,您才会获胜。
如果值的变化相对较慢,与传输更新的速率相比,您可以通过传输每个数据点的增量来提高效率,但只使用几位。例如,使用4位,您可以将值从-8传输到+7。只要增量从不大于增量,或者在它们“赶上”实际值之前传输几个增量就可以了。
有两种不同的机制可能不值得:一种是发送初始值,另一种是发送增量。如果你能够容忍滞后,那么为每个点假设一些恒定的初始值更有意义,然后只传输增量。
答案 1 :(得分:0)
有很多选择。如果大多数数据没有变化,只需发送已更改元素的(索引,值)对。如果大多数值发生变化但变化很小,则计算增量和gzip(或运行长度编码,或许多其他可能性)结果。