2011-11-03 84 views
3

快速設計問題:爲了在彼此之間發送事件,我需要在我的遊戲引擎架構中的客戶端 - 服務器網絡之間實現一種通信形式。Java - 網絡上的對象流效率

我選擇創建事件對象,因此我想知道將這些對象序列化並通過簡單套接字網絡上的對象流傳遞它們的效率如何?

也就是說,它相對於創建對象的字符串表示,通過char流發送字符串和解析字符串客戶端有多高效?

事件將發送到每個遊戲循環,如果不是更多;但事件對象本身只是一些簡單的包裝器,用於一些java基元。

感謝您的洞察!

(TL;博士 - 是通過網絡對象流高效?)

+1

我建議啓動一個Wireshark(http://www.wireshark.org/)並測試自己。 – Brad

回答

3

如果性能是首要的問題,我建議使用Protocol Buffers了自己的自定義序列化和Java的本機序列兩者。

喬恩斯基特給出了很好的解釋,以及基準這裏:High performance serialization: Java vs Google Protocol Buffers vs ...?

如果您不能使用的PB,我懷疑Java的本機序列將不是從String手動序列化/反序列化更加優化。這種差異是否顯着可能取決於你序列化對象的複雜程度。與往常一樣,您應該通過基準來確認您的預測。

事實上,你通過網絡發送東西應該沒有關係。

1

編輯:對於時間要求嚴格的應用程序Protocol Buffers是更好的選擇。但是,在我看來,開發時間顯着增加。實際上,你必須對每個交換消息進行兩次編碼:一次是作爲一個.proto文件編譯並吐出java包裝器,一次作爲一個POJO,使這些包裝器有用。但這是從文檔猜測。編輯

摘要
結束:去的對象流

那麼,什麼是少?編寫對象,發送字節流並解碼它所需的時間 - 全部由手工完成 - 或編碼對象所需的時間,發送字節流以及解碼它 - 所有這一切都需要通過可靠的嘗試序列化機制來完成?

你應該確保你發送的對象儘可能小。這可以通過枚舉值,查找表等來實現。每次傳輸可能會刪除幾個字節。序列化算法對我來說顯得非常快速,而且你編碼的任何東西都會完全相同。當你重新發明輪子時,往往會出現三角形。

+0

只要性能(或小序列化大小)很重要,那麼使用本機Java實現始終是錯誤的決定。無論如何,Protobuf並不複雜得多,提供跨語言支持,只是方式,方式更快。甚至有趣的是,如果序列化瓦特/ Java實習生需要40毫秒,而protobuf它在<2 .. – Voo

+0

@Voo是40ms是一個真正的測量數字? – EJP

+0

已經查看了ProtoBuf文檔。太糟糕了,9個月前,當我建立通信基礎設施時,這將會非常有用。因爲,本地序列化就像一個魅力,並且對於我的目的來說足夠快(往返時間大約爲50-100ms,用於序列化,發送到局域網中的服務器,反序列化,服務器端處理,重新序列化併發回給所有客戶)。也許爲廣域網旅程添加幾十毫秒,並且對於大多數應用程序來說足夠快。 –