5

我正在为 Windows Phone 7 编写多人游戏。我需要确保每个玩家的事件同时发生。我目前的方法是提前广播我希望事件发生的时间,并依靠手机的时钟相当准确。

问题是,我见过一些时钟不准确的情况——它可能会差几秒钟。所以我想做的是估计电话时钟的时间与服务器的时间有何不同。当然要考虑网络延迟,特别是因为对我开放的唯一网络协议是 Http。

所以我的问题是,有没有人知道我可以用来估计客户端和服务器之间时钟时间差异的算法,准确度约为 100 毫秒?

从我作为数学本科生的日子开始,我似乎记得有一个统计模型可以在这种情况下使用,我们正在采样一个假设为由一个常数加上一个误差量(延迟)组成的值,它可以是假设遵循某种分布。有人知道这一点,它真的适用吗?

4

2 回答 2

9

Christian 的算法(在与aaa's answer链接的演示文稿中发现)结果正是我所需要的。

在我的博客上,我有一个完整的(而且相当优雅,如果我自己这么说的话!)实现,在服务器端使用 WCF Rest,在客户端使用 RestSharp 和 Reactive Framework。

这是解释算法的博客文章的摘录:

  1. 客户端向服务器发送一条消息:“几点了?” [添加'先生。Wolf'是可选的]。至关重要的是,它记录了它发送消息的时间(称之为 T sent
  2. 服务器尽可能快地响应,根据自己的时钟 T server给出时间。
  3. 当客户端收到消息时,它会记录收到的时间(称之为 T received)。然后它会做一些数学运算:往返时间​​ RTT 是 T received - T sent。因此,假设服务器立即响应,并且两个方向的网络延迟相同,这意味着服务器实际上在 RTT/2 秒前发送了消息。因此,在客户端收到消息的瞬间,服务器端的时间是T server + RTT/2。然后客户端可以与自己的时钟进行比较并确定差异 - 时钟偏差。
于 2011-03-25T13:26:08.097 回答
0

不是统计模型/算法,但是...
我会通过记录调用服务器并获得响应所花费的时间来做到这一点。

然后,我将使用一半的时间(假设发送请求与响应所需的时间相同)来估计任何差异。我会将半时间跨度值与设备的实际时间一起传递给服务器,并让服务器计算出任何差异(考虑到这个半时间跨度偏移量)。

这将假设对服务器的第二次调用(具有一半时间跨度的调用)与第一次(定时)请求一样长。网络场、负载平衡器或不均匀的服务器负载可能会影响这一点。
确保您执行此过程的方法尽可能少地执行其他操作,以避免额外的延迟。

您可以尝试进行多次调用并使用时间的平均值来考虑不同的请求时间。试验看看这是否值得。

这完全取决于您需要的东西有多准确。如果您真的需要(接近)完美的准确性,您可能会不走运。

于 2011-02-22T09:21:07.180 回答