java - Udp 服务器太慢?

标签 java udp server client

所以我在做 MMO,我进步很大,花了 6 个月的时间来编写这个东西。 问题是我正在离线测试我的游戏,今天我有了一个绝妙的主意,将我的服务器移植到网上,我知道它会稍微慢一点,但它太糟糕了!延迟太大!!!游戏无法玩。 我像这样管理我的数据包....

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

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

最佳答案

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

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

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

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

关于java - Udp 服务器太慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32085073/

相关文章:

java - 将字符串数据类型中的日期更改为 java.sql.date 数据类型

java - 在android中显示当前音乐播放信息

c - UDP 段错误

java - 使用java在三个服务器之间进行UDP单播通信

c - C语言的套接字编程,服务器代码出错

javascript - 几个小时后,Nodejs 服务器停止接受连接

c# - 安全和短的服务器-客户端连接

java - 如何在 java 中解析复杂的嵌套 JSON?

c - 音频数据包类型

java - 如何在Java中的列表列表中插入和检查列表?