【发布时间】:2012-06-12 12:05:32
【问题描述】:
我正在使用 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,通常类似于 @987654327 @。然后我在我的更新方法中暂停我的游戏
- (void)update:(ccTime)dt
{
if (startTimeOut > 0)
{
NSLog(@"START TIME OUT %f", startTimeOut);
startTimeOut -= dt;
return;
}
}
但不幸的是,它没有帮助。此外,它甚至扩大了设备启动时间之间的差异。我就是不明白为什么。似乎我所做的一切都是合理的。我究竟做错了什么?我该如何纠正?你会怎么做?非常感谢
【问题讨论】:
-
两个设备上的时间可能完全不同,所以这个解决方案不适合你。
-
但是为什么呢?我指的是 [NSDate timeIntervalSinceReferenceDate];这对两种设备都是绝对的,所以它必须工作
-
你是怎么知道的? "返回接收者与格林威治标准时间 2001 年 1 月 1 日第一时刻之间的时间间隔。"
-
这不是绝对的。
timeIntervalSinceReferenceDate: "返回格林威治标准时间 2001 年 1 月 1 日第一时间与当前日期和时间之间的时间间隔"。当前日期和时间可由用户设置为任何值。因此,这两个设备的时间可能完全不同,或者在您的情况下它们相差几秒钟。 -
不可能在设备之间获得绝对时间同步。系统中的某个地方总是存在延迟。你必须使用更聪明的设备来使游戏公平。 Quake 3 Unlagged 服务器处理这个问题的方式(我认为)是维护每个帧的服务器状态,以便及时返回。每帧信息都打上时间标记,并在服务器历史记录中的相关帧中进行碰撞测试。
标签: iphone objective-c cocos2d-iphone multiplayer