我正在写一个游戏,有很多基于时间的方面。当网络中断和数据包没有通过时,我使用时间来帮助估计玩家的位置(以及数据包被接收和不接收之间的时间)。这是一个pacman类型的游戏,意思是玩家选择一个方向,不能停止移动,所以这个系统是有意义的(至少我认为是这样)。
因此,我有两个问题: 1)由于网络存在延迟,我如何同步游戏开始时的时钟。2)不对它们进行同步,只假设它们是相同的(我的代码与时区无关),这样做可以吗?这不是一个超级竞争的游戏,人们会改变他们的时钟作弊,但仍然。
这个游戏正在用Java和Python编程(并行开发作为一个项目)。
发布于 2013-06-17 09:41:38
我认为在系统中同步时钟绝对是不可以的。用户不希望您触摸系统设置,而且许多系统甚至不允许您这样做。
您所需要的只是有一个相关性,以将时间戳从一方的时钟转换为另一方的时钟。另一方面,如果你想用它来预测球员的位置的话,你需要这个相关性来更精确,比如说至少是百分之一秒。系统时钟不会在随机机器之间有如此好的关联。因此,您应该自己建立相关性,使用NTP主题上的一些变化,可能会嵌入到其他消息中,以节省网络带宽。
基本思想可能是,在您发送的每个数据包中,您发送的时间戳以及从另一方收到最后一个数据包时的序列号和时间戳。由此计算往返:例如,如果数据包Q表示它是在1000发送的,而数据包P是在500收到的,那么如果您在0发送了数据包P,并且在800接收到了q,那么往返的往返时间是(800-0)-(1000-500)= 300。不可能知道不对称度,所以你只需要假设包在两个方向上都会有一半(150)的滴答。这个远程时间戳比本地时间提前1000 -(800-150)= 350刻度。往返时间各不相同.如果你认为时钟是相当精确的,你应该使用一个长期平均值的相关性。
请注意,您也不想为时钟使用系统时钟。他们可能会在中途重新同步,让你偏离轨道。您应该在Unix上使用clock(CLOCK_MONOTONIC),在Windows上使用GetTickCount (目前不确定这些API是如何用Java或Python包装的)。
注意:SO_TIMESTAMP套接字选项(请参阅ott- in注释中提到的插座(7) )将有助于分离接收数据包的事件循环的延迟效应。这是否值得,这取决于你需要多好的精确度。
发布于 2013-06-18 15:03:43
你怎么知道哪个球员的钟是正确的?你不需要,所以使用参考时钟。
NTP在这里太过分了--你只需要1秒的精度--所以使用雷达或者从多个时钟同步算法。中挑选一些东西。
你已经选择了一个方法,让每个玩家的机器按照这个方法来获取时间(而不改变他们的系统时钟)。无论参考UTC时间和玩家的系统时钟UTC时间有什么不同,它们的有效偏移量都是UTC时间。任何时候,你做时间相关的计算,例如推断机器人的移动或射线跟踪子弹,你考虑这个偏移后,得到系统的时间。使用UTC将消除时区因素。
发布于 2013-06-18 16:18:37
我第二次声明,您不应该为此使用NTP或接近系统时钟。如果您实际检查了这个需求,您会发现您有以下需求:
这是一个简化的大纲--我不试图处理诸如延迟/丢弃数据包/等问题--但这是整个事件应该基于的基本框架。
所有这些都不需要接近系统时钟,也不需要关注诸如不同时区之类的问题,尽管最后一项可能使用某个时区(如果需要的话)。重要的是,实际经过的时间是用高分辨率的基于零的计时器来测量的,所以它们完全不知道时区的差异。要在服务器上找到实际的当前时间吗?只要将它经过的时间添加到它的参考基准时间中,就可以得到它了。客户也是如此。
https://softwareengineering.stackexchange.com/questions/201756
复制相似问题