2016-06-16 97 views
-3

我有一些需要回答的問題。我想知道如果我序列化一個對象併發送它,或者如果我轉儲所需的變量並重新構建服務器端的遊戲狀態,性能會有什麼差別。我很好奇的原因是因爲我正在創建一個遊戲,其中物理是由客戶端和服務器處理的,並且爲了確保它正常工作(並且沒有人在攻擊),我想知道什麼是最好的課程的行動。獲取當前遊戲狀態並通過互聯網發送

一些信息: 它是一個用Libgdx API用Java編寫的2D遊戲,我目前使用netty作爲我的網絡後端。

我一直在做筆記從這裏: http://gafferongames.com/networked-physics/the-physics-simulation/

+1

這是一個非常廣泛的主題,可能是StackOverflow的焦點話題。簡單的答案是以最適合您的方式編寫代碼,然後在後續優化時發現性能問題。請注意,_「序列化對象」_和_「轉儲所需的變量並重新構建服務器端的遊戲狀態」_兩者的含義基本相同,但在第一種情況下使用內置序列化,在第二種情況下,自己的序列化代碼。 –

+0

你確實提出了有效的觀點,它基本上是一回事,而且我的措辭非常寬泛。我想知道序列化是否會引入瓶頸或什麼,因爲我以前從未使用它。但我會試試看。 –

回答

1

正如吉姆·加里森說,這是一個很廣泛的問題,你應該先寫你的代碼,然後再優化它,但我會給你有關的幾點建議相同。

您可以以任何您想要的方式發送數據,最初它是您更喜歡的內容。您可以使用序列化Java對象並通過網絡發送它們開始。對於序列化數據,我建議你使用一些庫,如Kryo,與內建Java序列化相比,它非常快速。按照link查看各種jvm序列化器的性能。

對於開始,您可以使用Kryonet用於編寫網絡代碼的庫。 Kryonet使用Kryo序列化器來序列化您的Java對象並通過網絡發送它們。它也很容易使用。

稍後,您可以轉移到名爲Netty的網絡庫,它可以讓您編寫自己的協議。然後,如你所說,你可以寫一些最適合你的協議。將Netty與Google's Protobuf配對,你會得到一個非常好的網絡庫和頂級串行器。我現在也一起使用它們,我喜歡使用protobuf和netty提供的對protobuf的內置支持來定義自定義消息的方式。

最後,就黑客入侵而言,它應該是一個完全不同的問題。一旦你的遊戲成功了,你覺得人們想要破解你的遊戲,那麼你已經獲得了足夠的知識來了解如何避免相同:)

祝你好運!我希望答案能指出你正確的方向。

+0

我從來沒有聽說過Protobuf,但我會仔細研究它,因爲我已經在使用Netty進行網絡連接。 –