Java Udp服务器太慢?

Java Udp服务器太慢?,java,udp,server,client,Java,Udp,Server,Client,所以我在做一个MMO,我已经进步了很多,6个月了。 问题是我在离线测试我的游戏,今天我有了一个绝妙的主意,把我的服务器移植到网上,我知道它会稍微慢一点,但它太糟糕了!太多的滞后!!!这游戏不能玩。 我像这样管理我的数据包 玩家想要向上移动,客户端向服务器发送movePacket,服务器接收它,在服务器中移动玩家,并向所有客户端发送新位置。。。 每次怪物移动时,服务器都会向所有客户端发送一个新位置的消息 我以为我发送的数据包太多了,但我只是用播放器的移动来测试它。。。接收数据包并将其发送到客户端似

所以我在做一个MMO,我已经进步了很多,6个月了。 问题是我在离线测试我的游戏,今天我有了一个绝妙的主意,把我的服务器移植到网上,我知道它会稍微慢一点,但它太糟糕了!太多的滞后!!!这游戏不能玩。 我像这样管理我的数据包

玩家想要向上移动,客户端向服务器发送movePacket,服务器接收它,在服务器中移动玩家,并向所有客户端发送新位置。。。 每次怪物移动时,服务器都会向所有客户端发送一个新位置的消息

我以为我发送的数据包太多了,但我只是用播放器的移动来测试它。。。接收数据包并将其发送到客户端似乎有很大的延迟。。。。
我做错了这整件事吗?

网络游戏总是存在滞后问题。虽然你目前的方法是做事情的标准方法,但当你发现滞后变得难以忍受时(这是20世纪90年代和2000年初奥运会的一个常见问题)。最好的方法是几乎所有现代游戏都采用的方法,即尽可能多地在客户端执行操作,并且只使用权威服务器来解决客户端做出的预测之间的差异。以下是一些有助于减少感知滞后的方法:

  • 客户端预测
    对于MMO来说,这可能就是你所需要的。客户端预测的基本思想是在本地确定要做什么。在您的游戏中,当玩家想要向上移动时,他会发送一个写有[request:1 content:moveup]的数据包,然后在收到服务器的响应之前,客户端会显示向上移动的玩家(除非您已经知道这样的移动是无效的,即向上移动意味着撞到墙)。如果您的服务器速度非常慢,那么播放机也可能在收到响应之前向右移动,这样您的数据包下一个数据包可能看起来像[request:2 content:moveright],此时您将播放机显示在右侧。请记住,此时玩家已经向上移动,服务器甚至还没有确认向上移动是有效的移动。现在,如果服务器响应包1之后的新玩家位置应该是向上的,包2之后的位置应该是正确的,那么一切都很好。然而,如果让我们假设另一个玩家的步骤恰好在玩家的上面,那么服务器可能会在新的位置与玩家一起响应。此时,玩家将“传送”到服务器告诉他应该在的任何地方。这种情况并不经常发生,但当它发生时,它会非常明显(你可能已经在商业fps游戏中注意到)

  • 插值
    在这一点上,你可能很适合MMO游戏,但如果不是(或供将来参考),插值是你的下一步。这里的想法是发送更多关于数值变化速率的数据,以帮助其他玩家更流畅地移动。这与数学中使用泰勒级数预测函数值的概念相同。在这种情况下,您可以发送游戏中所有实体的位置、速度甚至加速度数据。这样,新位置可以计算为x=x+v*t+0.5*att,其中t是帧速率。同样,在服务器实际确认这是正确位置之前,显示玩家的预测位置。当来自服务器的下一个数据包到来时,您在大多数情况下都不可避免地会出错,但您发送的数据速率越高,您被关闭的时间就越少,因此其他实体的远程传送越小


  • 如果你想更详细地了解如何应对在线游戏中的延迟,请阅读多人游戏迷你圣经:

    有史以来最好的答案!谢谢,谢谢,我现在有了主意。。。Ps:我试着给你的答案投赞成票,上面说我需要15个rp tss!没问题,我认为你应该能够将它标记为正确的,这样它就可以在过滤器和搜索引擎中正确显示