1

我正在使用 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变量的差异,即 adouble并且通常类似于2.602417。然后我在更新方法中暂停我的游戏

- (void)update:(ccTime)dt
{   
    if (startTimeOut > 0)
    {
        NSLog(@"START TIME OUT %f", startTimeOut);
        startTimeOut -= dt;
        return;
    }
}

但不幸的是,它没有帮助。此外,它甚至扩大了设备启动时间之间的差异。我就是不明白为什么。似乎我所做的一切都是合理的。我究竟做错了什么?我该如何纠正?你会怎么办?非常感谢

4

1 回答 1

2

正如 Almo 评论的那样,不可能同时将两个设备同步。在最低级别,您将咬牙切齿地学习海森堡不确定性原理。即使让两台设备在十分之一秒内同步也不是一件容易的事。此外,时间同步将不得不或多或少频繁发生,因为每个设备中的时钟运行得非常轻微异步(即快一点点或慢一点点)。

您还必须考虑通过 Wifi、蓝牙或无线发送数据引入的延迟。这个延迟不是一个常数,在一帧中可以是 10 毫秒,在另一帧中可以是 1000 毫秒。你无法消除滞后,也无法预测它。但是你可以预测玩家的动作。

游戏或至少其中之一的解决方案是客户端预测和航位推算。这个 SO question 有一些感兴趣的链接。

于 2012-06-13T13:38:59.817 回答