Networking 什么样的数据结构/算法允许我使用最少的位发送键/值字典列表?

Networking 什么样的数据结构/算法允许我使用最少的位发送键/值字典列表?,networking,multiplayer,client-server,data-structures,compression,Networking,Multiplayer,Client Server,Data Structures,Compression,我的服务器对象具有相应的客户端对象。要保持同步的数据位于服务器对象的键/值字典中。为了使客户机对象与服务器对象保持同步,我希望服务器为每个对象每帧发送一个键/值字典 什么样的数据结构/算法允许我使用最少的位发送键/值字典列表 附加约束1:对于每种类型的对象,某些关键点的值的更改比其他关键点的更改更频繁。 额外限制2:服务器端的内存使用相对昂贵。您不需要发送整个词典。相反,只发送更改的内容 您不需要每帧发送一次。而是以与帧速率无关的固定间隔发送 第二点需要记住的一个重要思想是,客户端可以预测游戏状

我的服务器对象具有相应的客户端对象。要保持同步的数据位于服务器对象的键/值字典中。为了使客户机对象与服务器对象保持同步,我希望服务器为每个对象每帧发送一个键/值字典

什么样的数据结构/算法允许我使用最少的位发送键/值字典列表

附加约束1:对于每种类型的对象,某些关键点的值的更改比其他关键点的更改更频繁。
额外限制2:服务器端的内存使用相对昂贵。

您不需要发送整个词典。相反,只发送更改的内容


您不需要每帧发送一次。而是以与帧速率无关的固定间隔发送


第二点需要记住的一个重要思想是,客户端可以预测游戏状态的变化——在从服务器接收信息的过程中,可以继续模拟游戏,然后只需在再次收到来自服务器的权威信息后纠正错误。

没有特殊的数据结构或算法。传输分隔数据就足够了

示例数据(作为C字符串,请注意“\\”实际上是一个“\”):
key1;价值1;键2;价值2;键3\\;里面有分隔符;价值3\0

你可以选择你发送的密钥,它很容易读写**,占用很少的内存,甚至可以被压缩(因为它只是一个字节流)

*-阅读:

while( peekbyte() != 0 )
{
    key = readuntil( ';' ); // checks if previous byte isn't "\" while looking for char.
    value = readuntil( ';' );
    add( key, value );
}
**-写:

foreach( key in keylist )
{
    write( replace( ';', '\\;', key ) );
    write( replace( ';', '\\;', dict[ key ] ) );
}
write( '\0' );

请你接受答复好吗?(当然,考虑到您仍在访问。)