【问题标题】:SKScene's update method gets a "currentTime" that is different from CFAbsoluteTimeGetCurrent()SKScene 的更新方法得到一个不同于 CFAbsoluteTimeGetCurrent() 的“currentTime”
【发布时间】:2014-09-10 14:39:18
【问题描述】:

可以在新创建的 SpriteKit 项目中重现该问题。

新建项目后,我在MyScene类的update:方法中添加两行:

-(void)update:(CFTimeInterval)currentTime {
    NSLog(@"               currentTime = %f", currentTime);
    NSLog(@"CFAbsoluteTimeGetCurrent() = %f", CFAbsoluteTimeGetCurrent());
}

运行表明 currentTimeCFAbsoluteTimeGetCurrent() 返回的时间小几个数量级。我搜索了可能的原因,但没有找到。我能想到的唯一可能性是 currentTime 是自 00:00:00 01.01.2000 以外的某个其他日期以来的时间范围,但我不知道它将使用什么其他参考点,并且网上搜索也一无所获。

如何获取当前时间,计算方法与计算 currentTime 的规则相同?

【问题讨论】:

    标签: objective-c sprite-kit


    【解决方案1】:

    没什么,除非你愿意反汇编和理解 Sprite Kit 框架代码。

    虽然问题很可能是由 Sprite Kit 在较早的时间点采用 CFAbsoluteTimeGetCurrent 来解释的,然后将其传递给 update: 方法。简单地将消息发送到场景的开销意味着两次不能相同。或者currentTime可能不是通过CFAbsoluteTimeGetCurrent而是通过其他方式获取的。

    您可以做的是获取第一次更新的 currentTime:运行并将其存储在 ivar 中。然后,您可以将此时间用作场景的参考时间。

    【讨论】:

    • 我怀疑这只是因为 Sprite Kit 花费的时间早了一点。我刚刚再次运行代码,这是一次更新的输出:CFAbsoluteTimeGetCurrent() = 432056236.856374 currentTime = 4973700.943797 ... 差异大约是 430000000 秒。
    • CFAbsoluteTimeGetCurrent 正是我所期望的(距 2001 年 13.69 年)。当前时间很奇怪。那是大约57天。抱歉,不知道。
    • “系统时间”正如它在文档中所说的,可能与设备(操作系统)上次启动以来的时间有关。尝试重启设备,看看时差是否小于一天。
    • 我在模拟器上运行它。模拟器和mac都没有连续运行57天。我可以在模拟器上模拟重启吗?
    • 我的当前时间是 13.8 天。我上次重新启动是在 22 天前,昨天我启动了我的模拟器。如果您需要绝对时间,请使用 CFAbsoluteTimeGetCurrent。很明显,currentTime 是另外一回事。
    【解决方案2】:

    currentTime 是一个 CFTimeInterval,所以我希望它是某个时间点和当前时间之间的间隔——可能是场景开始后的间隔。如果让场景运行一分钟,值是否接近 60.0(60 秒)?

    CFAbsoluteTimeGetCurrent 是一个 CFAbsoluteTime,即自 2001 年 1 月 1 日以来的秒数,因此应该始终在 5 亿左右。

    【讨论】:

    • 这似乎是正确的。 Sprite Kit Programming Guide 说:“这里是渲染循环中的步骤:场景的 update: 方法被调用,模拟中到目前为止已经过去的时间。” [强调我的]
    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    相关资源
    最近更新 更多