我有具有相应客户端对象的服务器对象。要保持同步的数据位于服务器对象的键/值字典中。为了使客户端对象与服务器对象保持同步,我希望服务器在每个对象的每一帧都发送键/值字典。
什么数据结构/算法将允许我使用最少的位发送键/值字典列表?
额外约束 1:对于每种类型的对象,某些键的值比其他键的值更频繁地更改。奖励约束 2:服务器端的内存使用相对昂贵。
我有具有相应客户端对象的服务器对象。要保持同步的数据位于服务器对象的键/值字典中。为了使客户端对象与服务器对象保持同步,我希望服务器在每个对象的每一帧都发送键/值字典。
什么数据结构/算法将允许我使用最少的位发送键/值字典列表?
额外约束 1:对于每种类型的对象,某些键的值比其他键的值更频繁地更改。奖励约束 2:服务器端的内存使用相对昂贵。
您不需要发送整个字典。相反,只发送更改的内容。
您不需要每帧都发送它。相反,定期发送它与帧速率无关。
第二点要记住的一个重要思想是客户端可以预测游戏状态的变化——游戏可以在从服务器接收信息之间继续进行模拟,然后只需要在收到权威信息后纠正错误再次从服务器。
没有特殊的数据结构或算法。传输分隔数据就足够了。
示例数据(作为 C 字符串,注意“\\”实际上是“\”):key1;value1;key2;value2;key3\\;with delimiter inside it;value3;\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' );