如何平衡多人游戏的开始时间?

时间:2012-06-12 12:05:32

标签: iphone objective-c cocos2d-iphone multiplayer

我正在使用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;
    }
}

但遗憾的是它无济于事。此外,它甚至可以扩展设备启动时间之间的差异。我只是不明白为什么。好像我正在做的一切都是合理的。我究竟做错了什么?我该如何纠正?你会怎么做?非常感谢

1 个答案:

答案 0 :(得分:2)

正如Almo评论的那样,无法同时同步两台设备。在最低级别,你会在Heisenberg Uncertainty Principle上咬牙切齿。即使让两台设备在十分之一秒内同步也不是一件轻而易举的事。此外,时间同步必须或多或少地发生,因为每个设备中的时钟运行时稍微异步(即,快一点或稍慢一点)。

您还必须考虑通过Wifi,Blutooth或无线传输数据所引入的延迟。这种滞后不是常数,一帧可以是10ms,另一帧可以是1000ms。你无法取消延迟,也无法预测它。但是你可以预测玩家的动作。

游戏解决方案,或至少其中一个,是客户端预测和航位推算。 This SO question has a few links of interest.