2011-05-09 81 views
10

我正計劃構建一個Java服務器來處理客戶端之間的實時遊戲通信。在那裏可以有效地並且有希望在客戶端和服務器之間以高速進行準確通信(例如每秒5-15個數據包)的最佳Java實現類型是什麼?我知道有很多類型的Java聯網API(即ObjectInputStream和ObjectOutputStream,DatagramPacket,KyroNet等),但我不確定這種情況下最有效和/或常用的實現是什麼。我會假設大多數實時遊戲使用UDP通信方法,但我理解隨之而來的可靠性問題。是否有UDP實現具有某種形式的流量控制?無論如何,先謝謝了!什麼是實時遊戲服務器最高效的Java實現?

+1

15分組的第二不高的速度。 100k包/秒是。 – Erik 2011-05-09 22:57:04

+0

我正在閱讀關於他們如何製作其源服務器的Valve文章,他們說他們的平均每秒處理速度爲20-30包。由於我實際上構建了一個規模小得多的遊戲,所以我不需要那麼多。我認爲在一秒內有100,000個數據包會佔用相當多的帶寬,你不覺得嗎? – Brian 2011-05-09 23:10:30

+0

正在丟失任何意義的數據包?如果沒有,那麼我會用一個非常簡單的校驗和去找UDP(DatagramPacket),然後丟掉這些不好的包。儘管使用TCP建立連接本身可能是一個好主意。 – veiset 2011-05-09 23:25:40

回答

12

有幾件事情要考慮:

  • 的Java NIO真的很好,並能處理你正在尋找的那種吞吐量/延遲。不要使用任何舊的網絡/序列化框架和API
  • 延遲非常重要。你基本上需要一個NIO的最小層,它允許你以最小的開銷發送非常快速,小的,單個的消息。
  • 根據遊戲情況,您可能需要TCP或UDP或同時使用。使用TCP作爲重要消息,UDP用於消息不是嚴格需要遊戲繼續執行,或將被未來更新包含(例如,在FPS中的位置更新)
  • 有些人實現自己的類似TCP的消息協議通過UDP進行實時遊戲。這可能是更多的麻煩比它的價值,但要注意它作爲一個選項,如果你真的需要優化特定類型的通信
  • 對於實時遊戲,你幾乎總是做自定義序列(如僅發送增量而不是物體位置的完全更新) - 所以一定要確保你的框架允許這種

鑑於此,我建議以下

  • Kryonet之一 - lightwieght,可定製,專爲這種目的
  • Netty - 稍微面向企業,但很能幹,強大​​且可擴展
  • 滾你自己的基於NIO - 棘手,但如果你想真正的細粒度控制成爲可能。我以前做過這件事,但回想起來我可能應該選擇Kryonet或Netty

祝你好運!

+1

btw UDP + TCP之間的同步是很難破解的,它可能是服務器「黑客」問題的嚴重根源。國際海事組織,定製NIO不是那麼難,但我想這個問題不會在第一時間提出。知道何時使用直接緩衝區也需要經驗,我的take是每個客戶端的直接緩衝區以及套接字和緩衝區大小的容量。 – bestsss 2011-05-10 13:00:22

+0

非常感謝你,那不僅僅是信息。 – Brian 2011-05-11 00:17:50

+0

還有一個問題,使用更新的NIO API的主要優勢是什麼。當然,它更新,所以它可能更好,但與使用傳統套接字和服務器套接字相比,它有什麼不同? – Brian 2011-05-11 00:48:41

相關問題