2014-05-21 58 views
0

我目前正在開發一個統一的遊戲,在單獨的項目中有一個服務器和一個客戶端,他們可以通過發送字符串通過tcp套接字很好地通信,但這不是一個非常有效發送遊戲數據的方式。我想知道是否以及如何通過套接字發送類和/或對象。如果不是,格式化和處理數據以發送並接收數據的最佳方式是什麼?Unity3D通過套接字服務器發送類 - 客戶端通信

+0

http://msdn.microsoft.com/en-us/library/ms233843.aspx –

+0

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter %28V = vs.110%29。aspx –

+0

並以「C#二進制序列化」爲搜索結果 –

回答

0

大多數使用稱爲「bitpacking」的東西以非常緊湊的方式將數據打包到流中。 它需要相當多的低級序列化和反序列化代碼,但可以帶來更好的吞吐量和帶寬使用。

快速谷歌搜索術語「位打包」應該給你所有你需要找到一種方法來解決問題。

這個概念涉及到使用二進制tcp套接字只發送原始數據值和沒有類型信息。

好處的典型例子... 浮點值「12345678.12345678」作爲一個字符串,它是大量的數據,使用位打包,你可以簡單地發送代表這個數字的4個字節。

JSON表示但將發出類似...

someMessage { myVar: 123f }; 

那是一個很大的數據說「對象X在其目前的方向移動23F」 通常是大多數做的是一樣的東西..

class Message 
{ 
    public int OpCode { get; set; } 
    public byte[] Message { get; set; } 
} 

然後編寫代碼將要發送的字節「打包」爲此類型。 OpCode然後被「前綴」到消息中,所以當數據通過線路時,接收器總是在前4個字節中獲得OpCode,而其他任何消息數據都是。

接下來的想法是,發送者和接收者共享類型,以及對OpCodes意味着什麼的一些理解,以便字節數組可以「打包」和「解壓縮」。

因此,在我上面的示例中,操作碼將是123,意思是「以當前速度以當前方向移動」,然後字節[]將包含4個字節(可能)用於對象ID,然後另一個4字節用於可以移動。

因此總共發送了12個字節。 而不是,(如果我可以刪除所有空白)在上面的例子中的24個字節,這與一個相對較小的圓數爲浮動值,這幾乎從來沒有發生! 作爲一個字符串發送一個float幾乎肯定會花費你大約20個字節爲一個典型的浮點值本身,因爲3D遊戲需要3個這樣的位置(x,y,z),這是一個12字節的選擇或60只是一部分消息發送的位置!

希望這應該讓你開始,如果沒有別的。

如果問題更關注一點,我會很樂意給出一個更完整的答案,但鑑於這本質上是一個非常廣泛的複雜問題,很難提供完整的解決方案。

+0

我明白你在解釋什麼,它在我的待辦事項清單上。但我的問題是否有一種發送完整的類的方法,例如我有一個player.transform,併發送完整的類,如socket.send(player.transform),並在客戶端接收它作爲一個類喜歡它? –

相關問題