实时游戏服务器最有效的Java实现是什么?

时间:2011-05-09 22:50:13

标签: java tcp udp real-time

我正在计划构建一个能够处理客户端之间实时游戏通信的Java服务器。什么是最好的Java实现类型,可以有效地,并且希望在客户端和服务器之间高速准确地进行通信(比如每秒5-15个数据包)?我知道有很多类型的Java网络API(即ObjectInputStream和ObjectOutputStream,DatagramPacket,KyroNet等),但我不确定这种情况下最有效和/或最常用的实现是什么。我认为大多数实时游戏都使用UDP通信方法,但我理解随之而来的可靠性问题。是否有UDP实现具有某种形式的流量控制?无论如何,提前谢谢!

2 个答案:

答案 0 :(得分:12)

需要考虑的一些事项:

  • Java NIO非常好,可以处理您正在寻找的那种吞吐量/延迟。不要使用任何旧的网络/序列化框架和API
  • 延迟非常重要。你基本上想要一个基于NIO的最小层,它允许你以最小的开销发送非常快速,小的,个人的消息。
  • 根据游戏的不同,您可能需要 TCP或UDP或两者。对于重要消息使用TCP,对于游戏不是必需的消息使用UDP,或者将来的更新包含(例如,FPS中的位置更新)
  • 有些人通过UDP 实现自己的类似TCP的消息传递协议,用于实时游戏。这可能比它的价值更麻烦,但如果真的需要针对特定​​类型的通信进行优化,请注意它作为一种选择
  • 对于实时游戏,您几乎总是在进行自定义序列化(例如,只发送增量而不是对象位置的完整更新) - 所以请确保您的框架允许这样做

鉴于此,我建议使用以下其中一项

  • Kryonet - lightwieght,可定制,专为此目的而设计
  • Netty - 稍微更加面向企业,但非常强大,强大且可扩展
  • 基于NIO滚动你自己 - 很棘手,但如果你想要非常细粒度的控制可能。我以前做过这个,但回想起来我可能应该选择Kryonet或Netty
祝你好运!

答案 1 :(得分:1)

立即忘记ObjectOutputStream和ObjectInputStream。这些是旧标准java序列化的标准输出输入机制,它很慢并且会产生膨胀对象。一些资源开始: