游戏时钟在Python中同步

我正在使用pythonnetworking游戏项目,我们希望保持同步。 我会假设我们应该使用networking时间协议来迎合不同的滞后水平。

既然如此,是否有在Python中的networking时间协议的实现?

您可能无法直接使用NTP,例如,您需要有一台服务器保证可供您的所有客户端使用。 其次,这对你所需要的东西确实太过于夸张了。 你真正想做的是拿出一些共同的时间戳,所有的客户都可以达成一致。

基于http://www.mine-control.com/zack/timesync/timesync.html的方法,这里是我会做的(稍微修改):

  1. 客户端在“时间请求”数据包上标记当前本地时间并发送到服务器
  2. 一旦服务器收到服务器邮件服务器时间并返回
  3. 一旦客户端收到,客户端从发送的时间中减去当前时间,然后除以2来计算延迟。 它从服务器时间中减去当前时间来确定客户端 – 服务器时间增量,并增加半时延以获得正确的时钟增量。 (到目前为止,algothim与SNTP非常相似)
  4. 客户端重复步骤1至3五次或更多次,每次暂停几秒钟。 其他stream量可能在此期间被允许,但为了获得最佳结果应该被最小化。数据包收据的结果按最低延迟到最高延迟顺序进行累积和sorting。 中位延迟是通过从该有序列表中选取中点样本来确定的。
  5. 所有高于中位数大约1个标准偏差的样本被丢弃,剩下的样本用算术平均值进行平均。

唯一的区别是你不应该设置系统时间 – 大多数用户会认为这是不好的行为,此外,这很可能是需要管理员权限的东西,你的游戏不应该做任何需要管理员权限。

我可能会补充说,你应该在游戏中定期做一些时间同步,特别是如果它已经持续了一段时间。 你应该能够在游戏中find一个动作不那么重的点,这是同步的好时机。

或者,您可以对来自客户端和服务器的所有数据包进行时间戳记,并构建您的时间同步代码,以便可以使用任何数据包来确定当前的延迟以及共同的游戏时钟应该是什么。

你没有提到单个服务器是否是一个权威,但是有一个单一的时间,每个客户端同步。

根据我对“英雄之城”的经验,延迟可能是条纹状的,所以平均值(均方根很容易)是一个很好的近似方法。 我们还将所有往返时间标记为数据包标题的一部分。

说实话,既然事件的发生是不可预测的,打嗝的时候就没有多less事情可做,否则事情就很顺利,所以我不会费太多力气。