【问题标题】:How to balance start time for a multiplayer game?如何平衡多人游戏的开始时间?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-10-20
    • 2016-04-15
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多