2011-08-24 76 views
3

我正在研究多玩家fps,我正在考慮如何在遊戲狀態對象上執行增量壓縮。使用協議緩衝區的增量壓縮

在閱讀有關Q3如何做聯網,我認爲增量壓縮可以通過序列化對象的二進制狀態,然後只發送最後已知接收的對象和當前對象之間的二進制差異來實現。這是處理增量壓縮的正確方法嗎?

+0

總有幾種方式和一些不那麼重要的方面...但基本上你描述了我會怎麼做 - 所以是的:-) – Yahia

回答

1

那麼你有兩個選擇。

  • 您可以序列化狀態A和狀態B並運行結果上的差異。 (如你所描述的)。

  • 您可以使用結構的知識發現A國和B國之間的差異,序列化的結構差異。

下面是這個問題 - 數據的結構是這樣定義的,即採取增量比運行通用差異更快?

我相信它通常是。讓我們舉一個簡單的例子。我們的遊戲世界在遊戲狀態被定義爲P1(x,y,z)和P2(x,y,z)的任何時間點定義了P1和P2兩個項目(它們在世界各地奔跑)。因此,結構增量是6個變量(兩個玩家的x,y,z)之間的差異。計算這個很快 - 它是3個數學運算。然而,誰知道這些將如何序列化 - 然後diff例程將不得不做很多工作(至少一個循環)來查找結果的增量。

但它比這更好。既然你的遊戲引擎知道你關心隨着事物的改變而發生的變化,它可以把變化存儲在一個列表中,並且準備好發送變化而不需要任何計算(例如每當P移動時它就會保存變化)。

+1

我認爲,雖然第二個例子可能會更快,但它也會更多複雜。我認爲Q3爲什麼在整個對象上做三角洲的原因之一是他們的遊戲狀態很複雜。當我從複雜的數據結構的角度思考事物時,有許多屬性其中一些是複雜的結構本身,看起來簡單易行,只是選擇A –

+1

我認爲缺少的部分是如何通過Protobuf序列化空(或默認值)字段和一個未定義的字段。一旦壓縮增量,一個沒有改變的字段不應該被序列化。 'ShouldSerialize ...'序列化與默認值相同(沒有任何內容)。這意味着反序列化不能輕易區別於將值更改爲null或應保持不變。 – Wernight