我正在编写一个服务器,它每 300 毫秒向客户端发送一个游戏对象的“坐标缓冲区”。但我不想每次都发送完整的数据。例如,假设我有一个包含随时间变化的元素的数组:
0 0 100 50 -100 -50 在时间t 0 10 100 51 -101 -50 在时间t + 300ms
您可以看到只有 2 nd、 4 th和 5 th元素发生了变化。
不发送所有元素而只发送增量的正确方法是什么?理想情况下,我想要一个第一次返回完整数据并在没有更改时返回空数据的函数。
谢谢。
我正在编写一个服务器,它每 300 毫秒向客户端发送一个游戏对象的“坐标缓冲区”。但我不想每次都发送完整的数据。例如,假设我有一个包含随时间变化的元素的数组:
0 0 100 50 -100 -50 在时间t 0 10 100 51 -101 -50 在时间t + 300ms
您可以看到只有 2 nd、 4 th和 5 th元素发生了变化。
不发送所有元素而只发送增量的正确方法是什么?理想情况下,我想要一个第一次返回完整数据并在没有更改时返回空数据的函数。
谢谢。
您是否希望优化效率,或者这是一个学习练习?一些想法:
除非有很多数据,否则每次都发送所有数据可能是最简单的,而且效率也不是很低。
如果您每次都发送所有数据点的增量,则通过为未更改的点发送零而不是重新发送以前的值,您不会节省太多。
如果您只为那些发生变化的点发送数据,则需要为每个值提供一个索引。例如,如果点 3 增加 5,点 8 减少 2,那么您可以发送3 5 8 -2
. 但是现在,由于您要为每个更改的点发送两个值,因此只有少于一半的点更改时您才会获胜。
如果与传输更新的速率相比,值的变化相对较慢,您可以通过传输每个数据点的增量来提高效率,但只使用几个位。例如,使用 4 位,您可以传输从 -8 到 +7 的值。只要增量永远不会大于该值,或者可以在它们“赶上”实际值之前传输几个增量,这将起作用。
有两种不同的机制可能不值得:一种发送初始值,另一种发送增量。如果您可以容忍滞后,则为每个点假设一些恒定的初始值可能更有意义,然后仅传输增量。
有很多选择。如果大多数数据没有变化,只需发送已更改元素的 (index,value) 对。如果大多数值发生变化但变化很小,则计算增量和 gzip(或运行长度编码,或许多其他可能性)结果。