【发布时间】:2014-10-09 16:11:27
【问题描述】:
我在 Python 2.7 中编写了一个应用程序,我正在使用 UDP 套接字来实现网络功能。虽然我的应用程序不是游戏,但我认为它是用于网络用途的游戏,因为屏幕每秒重绘 60 次。
我不需要 extreme 精度,所以我不需要每秒发送大量数据包,但我实现网络的方式会导致其他用户看起来“不稳定”,如果有每秒发送的数据包数量不多。
经过一番研究和摆弄,我决定每 50 毫秒发送一个数据包。这让其他用户在一段时间内看起来相当“流畅”,但大约一分钟后,他们变得越来越不稳定,最终到了没有更新发生的地步。
我应该如何像视频游戏中的网络那样实现网络?似乎我从根本上错过了一些东西。
【问题讨论】:
-
您永远不应该将您的更新同步到网络。如果有任何网络服务中断,您的“游戏”将冻结。相反,您不断重绘相同的信息,并在新数据包进入时更新该信息。没有网络,您只是不断重绘相同的东西。新数据进来,你就会得到一张新照片。
-
除此之外,大多数视频游戏都实现了某种预测模型。传入的网络数据包作为模型的更正,因此理论上游戏可以无限期地继续运行而不会收到任何新的数据包。像 MMO 这样的一些游戏每秒都有更新间隔,因此它们显示的几乎每一帧都是基于预测的。
-
@MarcB 这就是我现在实现的。我基本上只是更新位置和数据包到达的时间,但我每秒重绘所有内容 60 次。所以我可以每秒发送一个数据包,但这意味着联网的用户将在一个位置停留一整秒,然后会收到一个数据包,更新他们的位置,然后他们会在那个位置被绘制到另一个位置第二。
-
如果您曾经玩过在线游戏,您可能会在某个时候被套牢。一旦游戏让你朝着某个方向前进,它就会一直假设你只会朝着那个方向前进,直到订单发生变化。如果数据包丢失或丢失,最终您的 char 会在客户端与服务器所说的状态同步时反弹。
-
@MarcB 啊,我明白了。
标签: python sockets networking udp frame-rate