我有服務器對象有相應的客戶端對象。要保持同步的數據位於服務器對象的鍵/值字典中。爲了使客戶端對象與服務器對象保持同步,我希望服務器爲每個對象每幀發送一次鍵/值字典。什麼數據結構/算法將允許我使用最少量的位發送鍵/值字典列表?
什麼數據結構/算法將允許我使用最少量的位發送鍵/值字典列表?
獎勵約束條件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');
請你接受一個答案? (當然,你還在訪問。) – corazza