Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python UDP数据包应该多久发送一次?_Python_Sockets_Networking_Udp_Frame Rate - Fatal编程技术网

Python UDP数据包应该多久发送一次?

Python UDP数据包应该多久发送一次?,python,sockets,networking,udp,frame-rate,Python,Sockets,Networking,Udp,Frame Rate,我已经用Python2.7编写了一个应用程序,我正在使用UDP套接字实现网络功能。虽然我的应用程序不是游戏,但我认为它是一个联网的游戏,因为屏幕每秒重画60次。 我不需要非常精确,因此我不需要每秒发送大量数据包,但我实现网络的方式会导致其他用户在每秒发送的数据包数量不合理的情况下看起来“不稳定” 经过一些研究和修改,我决定每50毫秒发送一个数据包。这让其他用户在一段时间内看起来相当“平稳”,但大约一分钟后,他们变得越来越不稳定,最终没有更新发生 我应该如何实现像视频游戏中那样的联网?从根本上看,

我已经用Python2.7编写了一个应用程序,我正在使用UDP套接字实现网络功能。虽然我的应用程序不是游戏,但我认为它是一个联网的游戏,因为屏幕每秒重画60次。 我不需要非常精确,因此我不需要每秒发送大量数据包,但我实现网络的方式会导致其他用户在每秒发送的数据包数量不合理的情况下看起来“不稳定”

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


我应该如何实现像视频游戏中那样的联网?从根本上看,我似乎遗漏了一些东西。

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


对UDP进行编程是一门黑色艺术——它需要在需要时对网络拥塞做出反应,并降低发送速率。一个简单的解决方案是让接收者定期发送所接收数据包的摘要(比如,每RTT发送一次),当您看到太多的丢失时,降低发送速率。理想情况下,您应该将其与精确的RTT估计器相结合,并在RTT突然增加时先发制人地降低发送速率。

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