Udp服务器太慢了?

时间:2015-08-19 01:22:42

标签: java udp server client

所以,我正在做一个MMO,我正在进步很多,6个月进行这个事情。 问题是我正在测试离线我的游戏,今天我有一个绝妙的想法,移植我的服务器并使其在线,我知道它会稍微慢一点,但它可怕!太滞后!!!游戏无法播放。 我像这样管理我的数据包......

播放器想要向上移动,客户端将movePacket发送到服务器,服务器接收它,在服务器中移动播放器并将新位置发送给所有客户端...... 每次怪物移动,服务器都会向所有客户发送新位置......

我以为我是在发送数据包,但是我只是根据播放器的移动进行测试......它似乎有很大的延迟来接收数据包并将它们发送给客户端.... 我这整件事都错了吗?

1 个答案:

答案 0 :(得分:4)

滞后一直是网络游戏的问题。虽然你当前的方法是标准的做事方式,但你发现滞后变得无法忍受(1990年代和2000年初的常见问题)。最好的方法是采用与几乎所有现代游戏相同的方法,与客户端一样多,只使用权威服务器来解决客户所做的预测之间的差异。以下是一些减少感知滞后的有用方法:

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

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

  3. 如果您想要更详细地了解如何处理在线游戏中的延迟,请阅读多人游戏中的迷你圣经:http://www.gabrielgambetta.com/fast_paced_multiplayer.html