java中的mmo游戏应该使用什么。UDP还是TCP?为什么?TCP是点对点的关系,每一个数据包都通过,而UDP没有点对点的关系,可以丢弃数据包导致延迟。在这种情况下使用哪个更好?
5 回答
答案不是取决于语言,而是取决于游戏的要求。
如果您的游戏可以处理来自玩家(或服务器)的状态更新,无论是丢失还是乱序到达,那么 UDP 应该没问题。
如果您需要具有最小延迟的实时响应(并且上述问题已解决),那么您还应该使用 UDP。
否则,您应该使用 TCP。
不管是不是Java,TCP和UDP都有独立于语言的相同优缺点。
但通常它归结为一个基本的设计问题:当一个数据包被丢弃时,应该发生什么?
- 假装它从未发生过。这是 UDP 领域。
- 等到数据包重新发送。这是应该使用 TCP 的地方。
这两种方法本身都没有对错,两者都会给你的游戏带来问题,但这是你应该首先回答的问题。
See this question:
我对 UDP 和 TCP 的体验是这样的:
- UDP明显更快。我们说的是 2 个数量级。
- 在有线网络上,UDP丢包率小于1%
- 在无线网络上,UDP 数据包丢失率很容易达到 80%,而与路由器的物理距离很重要:一英尺外的数据包丢失率为 20%,20 英尺外的数据包丢失率为 50%。
所以 UDP 适用于非必要的东西。例如,如果有 2 个家伙在你的游戏中跑来跑去,玩家 A 每 100 毫秒通过 UDP 接收玩家 B 的当前坐标和速度,玩家 A 可以推断一段时间而不会走得太远。另一方面,如果玩家 A 拿到葫芦,而玩家 B 拿到皇家同花顺,情况就不同了。
在我的项目中,我使用 UDP 作为主要通信方案,每个接收者都发回一个通知。如果通信失败的时间超过 X,我求助于 TCP。
这个问题与Java并没有真正的联系。UDP数据报不能保证到达目的地,TCP数据报可以。连续的 UDP 数据报也可能无序到达目的地。例如,DNS 基于 UDP,因为请求和响应只需要一个数据报。如果您需要可靠性并且不想实施重试。TCP 是您的选择。如今,计算开销很小,因此我认为支持 UDP 不会带来太多的性能提升。