【发布时间】:2011-09-10 14:17:05
【问题描述】:
我已经制作了一款 MMO 游戏,但当很多人连接时,我会遇到很多延迟。我正在使用 UDP 和 TCP 数据包。 TCP 似乎工作得很好,通过 UDP 有时会延迟 5 秒。什么可能导致这种情况?我正在使用 MongoDB,每个客户端每秒发送 30 次数据包。谢谢。
【问题讨论】:
-
我对这个问题的后续行动很感兴趣。你解决了吗?以下任何答案是否正确?谢谢
我已经制作了一款 MMO 游戏,但当很多人连接时,我会遇到很多延迟。我正在使用 UDP 和 TCP 数据包。 TCP 似乎工作得很好,通过 UDP 有时会延迟 5 秒。什么可能导致这种情况?我正在使用 MongoDB,每个客户端每秒发送 30 次数据包。谢谢。
【问题讨论】:
UDP 协议不为包裹递送提供保证。所以你的问题可能在这。 http://en.wikipedia.org/wiki/User_Datagram_Protocol
【讨论】:
猜测:您的 UDP 数据包接收路径涉及分配内存,而您泄漏了该内存。收到的数据包越多,分配内存的时间就越长。
【讨论】:
我也在这里猜测,但情况可能是您的应用程序每 n 毫秒轮询一次 UDP 数据包(例如,如果您的 FPS 为 20,则 n将是 50 毫秒)。
现在猜测是,在此期间,您的 PC 会收到大量 UDP 数据包,它们会被您的操作系统堆积起来。然后,当您轮询这些数据包时,您或操作系统不会立即清除堆栈。更大的堆栈可能意味着更大的延迟。
我想我在某处读到过,甚至一些路由器也试图变得聪明并堆叠 UDP 数据包。但是我找不到我看到它的页面。
我在这里发布了一个类似的问题:
Router gets unresponsive when using UDP
以上是我目前的理论:),不幸的是我还不知道如何解决它。我想到的一种可能性是使用一个单独的线程来立即对网络请求做出反应,而不是每 n 毫秒轮询一次网络。
【讨论】: