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

3
我已经用Python 2.7编写了一个应用程序,并使用UDP套接字实现网络功能。尽管我的应用程序不是游戏,但出于网络目的,我认为它是一个网络游戏,因为屏幕每秒重新绘制60次。
我不需要极高的精度,所以不需要每秒发送大量数据包,但我实现网络的方式会使其他用户看起来“卡顿”,如果没有足够的数据包发送。
经过一些研究和试验,我决定每50毫秒发送一个数据包。这使得其他用户的表现相当“平滑”一段时间,但大约一分钟后,它们变得越来越“卡顿”,最终没有任何更新。
我应该如何实现类似于视频游戏中的网络?似乎我基本上缺少某些东西。

3
永远不要将更新同步到网络。如果有任何网络服务中断,您的“游戏”将会冻结。相反,您应该保持重绘相同的信息,并在每次收到新数据包时更新该信息。没有网络,您只需不断重新绘制相同的内容。当有新数据到来时,您就会得到一幅新图片。 - Marc B
1
此外,大多数视频游戏都实现了某种预测模型。传入的网络数据包充当模型的校正,因此理论上游戏可以在不接收任何新数据包的情况下无限运行。一些像MMO这样的游戏每秒钟更新几次,因此它们显示的几乎每个帧都是基于预测的。 - Ross Ridge
@MarcB 这就是我目前实现的内容。我基本上只是更新位置,当数据包到达时重新绘制所有物体,但每秒重绘60次。因此,我可以每秒发送一个数据包,但这意味着网络用户将在同一地点绘制整整一秒钟,然后接收到一个数据包,更新其位置,然后又在新位置上绘制一秒钟。 - user3745189
如果你玩过网游,你可能在某个时刻会遇到“橡皮筋效应”。一旦游戏让你往某个方向行动,它就会一直假设你只会往那个方向移动,直到有新的指令到达。如果某个数据包丢失或错过,你的角色最终会被弹来弹去,直到客户端与服务器同步你的状态。 - Marc B
@MarcB 哦,我现在明白了。 - user3745189
1个回答

0

在我看来,网络正在变得拥挤,传输旧数据包并丢弃新数据包。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接