【问题标题】:Udp server too slow?udp服务器太慢?
【发布时间】:2015-11-12 03:18:00
【问题描述】:

所以我在做一个 MMO,我进步了很多,6 个月的时间来编程这个东西。 问题是我正在离线测试我的游戏,今天我有一个绝妙的想法来移植我的服务器并使其在线,我知道它会稍微慢一点,但它太糟糕了!太滞后了!!!游戏无法玩。 我像这样管理我的数据包....

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

我以为我发送数据包已经结束了,但我只是通过播放器的移动来测试它......接收数据包并将它们发送给客户端似乎有很大的延迟...... 我做错了吗?

【问题讨论】:

    标签: java udp server client


    【解决方案1】:

    延迟一直是在线游戏的问题。虽然您当前的方法是做事的标准方式,但随着您发现滞后变得难以忍受(这是 1990 年代和 2000 年初游戏中的常见问题)。最好的方法与几乎所有现代游戏所采用的方法相同,即尽可能多地在客户端进行操作,并且仅使用您的权威服务器来解决客户端做出的预测之间的差异。以下是一些减少感知滞后的有用方法:

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

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

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

    【讨论】:

    • 最佳答案!谢谢,谢谢,我现在有了这个想法...... Ps:我试图投票给你的答案,它说我需要15 rp tss!
    • 没问题,我认为您应该仍然可以将其标记为正确,以便它在过滤器和搜索引擎中正确显示
    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多