我正在使用GameKit进行多人游戏。我的问题是,当连接两个设备时,游戏开始运行时会有轻微的时差。设备开始运行游戏稍后。但这不是我想要的。我想让它在两台设备上同时启动。所以我要做的第一件事就是在两个设备上查看开头的时间,如下所示:
startTime = [NSDate timeIntervalSinceReferenceDate];
这就是它的样子:
361194394.193559
然后我将startTime
值发送到另一个设备,然后我将接收到的值与另一个设备的startTime进行比较。
- (void)balanceTime:(double)partnerTime
{
double time_diff = startTime - partnerTime;
if (time_diff < 0)
startTimeOut = -time_diff;
}
因此,如果两个开始时间之间的差异为负,则意味着此设备较早启动,因此必须等待分配给startTimeOut
变量的差异,这是double
并且通常是像2.602417
这样的东西。那么我在我的更新方法中暂停我的游戏
- (void)update:(ccTime)dt
{
if (startTimeOut > 0)
{
NSLog(@"START TIME OUT %f", startTimeOut);
startTimeOut -= dt;
return;
}
}
但遗憾的是它无济于事。此外,它甚至可以扩展设备启动时间之间的差异。我只是不明白为什么。好像我正在做的一切都是合理的。我究竟做错了什么?我该如何纠正?你会怎么做?非常感谢
答案 0 :(得分:2)
正如Almo评论的那样,无法同时同步两台设备。在最低级别,你会在Heisenberg Uncertainty Principle上咬牙切齿。即使让两台设备在十分之一秒内同步也不是一件轻而易举的事。此外,时间同步必须或多或少地发生,因为每个设备中的时钟运行时稍微异步(即,快一点或稍慢一点)。
您还必须考虑通过Wifi,Blutooth或无线传输数据所引入的延迟。这种滞后不是常数,一帧可以是10ms,另一帧可以是1000ms。你无法取消延迟,也无法预测它。但是你可以预测玩家的动作。
游戏解决方案,或至少其中一个,是客户端预测和航位推算。 This SO question has a few links of interest.