我认为这是绝对不能确定synchornize时钟系统。用户不希望您触摸系统设置,许多系统甚至不允许您触摸。
您所需要做的就是建立一个关联,以将时间戳从一侧的时钟转换为另一侧的时钟。另一方面,如果您想使用这种相关性来预测玩家的位置,则需要使这种相关性非常精确,至少要达到百分之一秒。随机机器之间的系统时钟永远不会如此相关。因此,您应该使用NTP主题的一些变体来自己建立相关性,可能将其嵌入其他消息中以节省网络带宽。
基本思想可能是,对于每个发送了时间戳的数据包,您都将发送它,并在从另一端接收到最后一个数据包时发送它的序列号和时间戳。由此计算出往返次数:例如,如果数据包Q说它是在1000发送的,而数据包P是在500接收的,则给定的是,您在0发送数据包P并在800接收到Q,则往返数是(800-0 )-(1000-500)=300。无法知道不对称性,因此您仅假设数据包在任一方向上花费了一半(150)滴答声。而且该远程时间戳比本地时间戳提前1000-(800-150)= 350 ticks。往返行程会有所不同。如果您假设时钟相当精确,则应使用相关性的长期平均值。
请注意,您也不想使用系统时钟。他们可能会在中途重新同步,从而使您偏离轨道。您应该clock(CLOCK_MONOTONIC)
在Unix或GetTickCount
Windows上使用(不知道现在这些API如何用Java或Python包装)。
注意:SO_TIMESTAMP
套接字选项(请参阅ott--在问题注释中提到的socket(7))对于区分接收数据包的事件循环的延迟影响很有用。是否值得付出努力取决于您需要多高的精度。