【问题标题】:How often should UDP packets be sent?UDP数据包应该多久发送一次?
【发布时间】:2014-10-09 16:11:27
【问题描述】:

我在 Python 2.7 中编写了一个应用程序,我正在使用 UDP 套接字来实现网络功能。虽然我的应用程序不是游戏,但我认为它是用于网络用途的游戏,因为屏幕每秒重绘 60 次。

我不需要 extreme 精度,所以我不需要每秒发送大量数据包,但我实现网络的方式会导致其他用户看起来“不稳定”,如果有每秒发送的数据包数量不多。

经过一番研究和摆弄,我决定每 50 毫秒发送一个数据包。这让其他用户在一段时间内看起来相当“流畅”,但大约一分钟后,他们变得越来越不稳定,最终到了没有更新发生的地步。

我应该如何像视频游戏中的网络那样实现网络?似乎我从根本上错过了一些东西。

【问题讨论】:

  • 您永远不应该将您的更新同步到网络。如果有任何网络服务中断,您的“游戏”将冻结。相反,您不断重绘相同的信息,并在新数据包进入时更新该信息。没有网络,您只是不断重绘相同的东西。新数据进来,你就会得到一张新照片。
  • 除此之外,大多数视频游戏都实现了某种预测模型。传入的网络数据包作为模型的更正,因此理论上游戏可以无限期地继续运行而不会收到任何新的数据包。像 MMO 这样的一些游戏每秒都有更新间隔,因此它们显示的几乎每一帧都是基于预测的。
  • @MarcB 这就是我现在实现的。我基本上只是更新位置和数据包到达的时间,但我每秒重绘所有内容 60 次。所以我可以每秒发送一个数据包,但这意味着联网的用户将在一个位置停留一整秒,然后会收到一个数据包,更新他们的位置,然后他们会在那个位置被绘制到另一个位置第二。
  • 如果您曾经玩过在线游戏,您可能会在某个时候被套牢。一旦游戏让你朝着某个方向前进,它就会一直假设你只会朝着那个方向前进,直到订单发生变化。如果数据包丢失或丢失,最终您的 char 会在客户端与服务器所说的状态同步时反弹。
  • @MarcB 啊,我明白了。

标签: python sockets networking udp frame-rate


【解决方案1】:

在我看来,网络正在变得拥塞,传输进入路由器队列的旧数据包并丢弃新数据包。

编程 UDP 是一种魔法——它需要在需要时对网络拥塞做出反应,并降低发送速率。一个简单的解决方案是让接收器定期发送接收数据包的摘要(例如,每个 RTT 一次),并在您看到太多丢失时降低发送速率。理想情况下,您可以将其与精确的 RTT 估算器相结合,并在 RTT 突然增加时抢先降低发送速率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2018-04-26
    • 2013-09-15
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    相关资源
    最近更新 更多