2012-05-13 51 views
1

我正在寫一個服務器,每隔300ms向客戶端發送一個「座標緩衝區」的遊戲對象。但我不想每次發送完整的數據。例如,假設我有隨時間變化的元素的數組:數據delta的計算

 
0 0 100 50 -100 -50 at time t 
0 10 100 51 -101 -50 at time t + 300ms 

可以看到,只有2 第二,4 和5 元件已經改變。

什麼是正確的方式發送不是所有的元素,但只有三角洲?理想情況下,我想要一個函數,它在第一次返回完整數據並在沒有更改時清空數據。

謝謝。

回答

1

您是否希望優化效率,或者這是一個學習練習?一些想法:

  • ,除非有一個數據的大量,它可能是最簡單的,而不是非常低效的,每次發送的所有數據。

  • 如果您每次發送所有數據點的增量,您不會通過爲不變的點發送零來節省很多,而不是重新發送以前的值。

  • 如果您只發送那些發生變化的點的數據,則需要爲每個值提供一個索引。例如,如果點3增加5,點8減少2,則可以發送3 5 8 -2。但是現在,由於您發送的每個點發生變化的值爲兩個,所以只有少於一半的點發生變化時纔會獲勝。

  • 如果與傳輸更新的速率相比,這些值的變化相對較慢,那麼可以通過爲每個數據點傳輸增量,但僅使用幾個位來提高效率。例如,使用4位可以傳輸-8到+7的值。只要三角洲的大小不會超過這個數字,或者在它們「趕上」實際值之前傳輸幾個delta值就可以了。

  • 有兩種不同的機制可能不值得:一個發送初始值,另一個發送增量。如果你可以容忍滯後,那麼對每個點假定一些不變的初始值可能更有意義,然後只傳送增量。

+0

它應該是在實際項目中的優化。我正在從足球比賽發送線索。客戶的數量約爲10K。所以即使是幾個字節也會優化很多。 – Ockonal

+0

完整列表中有多少個座標?壓縮數據有很多好方法,但總的來說,最好先讓代碼工作,然後在決定是否值得優化之前對其進行基準測試。 –

+0

22條繩+20條技術資料。 – Ockonal

0

有很多選擇。如果大多數數據沒有變化,只需發送(索引,值)對變化的元素。如果大多數值發生變化但變化很小,則計算delta和gzip(或運行長度編碼,或許多其他可能性)結果。