我正計劃構建一個Java服務器來處理客戶端之間的實時遊戲通信。在那裏可以有效地並且有希望在客戶端和服務器之間以高速進行準確通信(例如每秒5-15個數據包)的最佳Java實現類型是什麼?我知道有很多類型的Java聯網API(即ObjectInputStream和ObjectOutputStream,DatagramPacket,KyroNet等),但我不確定這種情況下最有效和/或常用的實現是什麼。我會假設大多數實時遊戲使用UDP通信方法,但我理解隨之而來的可靠性問題。是否有UDP實現具有某種形式的流量控制?無論如何,先謝謝了!什麼是實時遊戲服務器最高效的Java實現?
回答
有幾件事情要考慮:
- 的Java NIO真的很好,並能處理你正在尋找的那種吞吐量/延遲。不要使用任何舊的網絡/序列化框架和API
- 延遲非常重要。你基本上需要一個NIO的最小層,它允許你以最小的開銷發送非常快速,小的,單個的消息。
- 根據遊戲情況,您可能需要TCP或UDP或同時使用。使用TCP作爲重要消息,UDP用於消息不是嚴格需要遊戲繼續執行,或將被未來更新包含(例如,在FPS中的位置更新)
- 有些人實現自己的類似TCP的消息協議通過UDP進行實時遊戲。這可能是更多的麻煩比它的價值,但要注意它作爲一個選項,如果你真的需要優化特定類型的通信
- 對於實時遊戲,你幾乎總是做自定義序列(如僅發送增量而不是物體位置的完全更新) - 所以一定要確保你的框架允許這種
鑑於此,我建議以下
- Kryonet之一 - lightwieght,可定製,專爲這種目的 的
- Netty - 稍微面向企業,但很能幹,強大且可擴展
- 滾你自己的基於NIO - 棘手,但如果你想真正的細粒度控制成爲可能。我以前做過這件事,但回想起來我可能應該選擇Kryonet或Netty
祝你好運!
btw UDP + TCP之間的同步是很難破解的,它可能是服務器「黑客」問題的嚴重根源。國際海事組織,定製NIO不是那麼難,但我想這個問題不會在第一時間提出。知道何時使用直接緩衝區也需要經驗,我的take是每個客戶端的直接緩衝區以及套接字和緩衝區大小的容量。 – bestsss 2011-05-10 13:00:22
非常感謝你,那不僅僅是信息。 – Brian 2011-05-11 00:17:50
還有一個問題,使用更新的NIO API的主要優勢是什麼。當然,它更新,所以它可能更好,但與使用傳統套接字和服務器套接字相比,它有什麼不同? – Brian 2011-05-11 00:48:41
Immidiately忘記ObjectOutputStream和ObjectInputStream。這些是舊的標準java序列化的標準輸出輸入機制,它很慢並且產生膨脹對象。一些資源入手:
- 1. 什麼是實現遊戲計時器的最有效方式
- 2. 實時瀏覽器遊戲服務器
- 3. Android遊戲高分實現
- 4. Conway的人生遊戲的最新序幕實現是什麼?
- 5. Android:實現遊戲板的最佳方式是什麼?
- 6. 實現實時多人遊戲有什麼樣的問題
- 7. 爲FPS遊戲編寫XNA遊戲服務器的最佳方式是什麼?
- 8. 誰是實時TCP/IP遊戲服務器的良好主機?
- 9. 什麼是遊戲服務器的最佳雲計算平臺?
- 10. 實體框架與遊戲服務器
- 11. 在服務器中實現AutoComplete的最佳方式是什麼?
- 12. 用Parse.com安全玩遊戲服務(實時遊戲)
- 13. Google Play遊戲服務實時多人遊戲
- 14. 服務器實現基於網頁的Silverlight卡片遊戲
- 15. 如何實現高效的Alpha-Beta修剪遊戲搜索樹?
- 16. Java中游戲實體位置的高效映射
- 17. SOAP服務器實現錯誤通知的「最佳實踐」是什麼?
- 18. 我想實現一個遊戲java的計時器?
- 19. 爲多人遊戲實現後端服務器的最簡單方法? (COMET/longpolling)
- 20. 實現OpenID服務器(最好是Ruby)的最佳方式是什麼?
- 21. 將遊戲實現爲快速遊戲
- 22. 提供實時遊戲狀態更新的服務器
- 23. 實時遊戲的對等vs服務器客戶端
- 24. 遊戲樹的C++實現
- 25. 實現在2D GLKit/iOS遊戲中滾動的最佳做法是什麼?
- 26. 在ActionScript 3中實現遊戲菜單的最簡單方法是什麼?
- 27. 什麼是實現Web服務/ API的最安全的方式?
- 28. 如何實現實時多玩家谷歌玩遊戲服務C++到cocos2d-x
- 29. Web服務器和遊戲服務器有什麼區別?
- 30. Java的實時調試(遊戲)
15分組的第二不高的速度。 100k包/秒是。 – Erik 2011-05-09 22:57:04
我正在閱讀關於他們如何製作其源服務器的Valve文章,他們說他們的平均每秒處理速度爲20-30包。由於我實際上構建了一個規模小得多的遊戲,所以我不需要那麼多。我認爲在一秒內有100,000個數據包會佔用相當多的帶寬,你不覺得嗎? – Brian 2011-05-09 23:10:30
正在丟失任何意義的數據包?如果沒有,那麼我會用一個非常簡單的校驗和去找UDP(DatagramPacket),然後丟掉這些不好的包。儘管使用TCP建立連接本身可能是一個好主意。 – veiset 2011-05-09 23:25:40