【问题标题】:SpriteKit's Update Function: time vs. framerateSpriteKit 的更新函数:时间 vs. 帧率
【发布时间】:2014-10-07 10:26:43
【问题描述】:

总的来说,我是编程和 Spritekit 的新手,我有兴趣探索毫秒和帧率之间的关系,以及如何将更新函数用作两者之间的中介。

帧率与毫秒

本质上,帧率和时间之间的主要区别在于时间始终是一致的,而帧率则不是(由于密集的图形程序,它可能会下降)。但是,通常在 SKScene 的更新事件(每帧调用)期间检查和设置时间,所以我试图弄清楚如何正确计算时间,当你不知道一秒钟会有多少帧时.

示例

我目前正在研究太空射击游戏的更新事件,其中更新函数负责计算生成另一个外星人之前的时间间隔。你可以在这里查看完整代码:http://www.globalnerdy.com/2014/08/10/a-simple-shoot-em-up-game-with-sprite-kit-and-swift-part-one-last-things-first-the-complete-project/

// Called exactly once per frame as long as the scene is presented in a view
// and isn't paused
override func update(currentTime: CFTimeInterval) {
    var timeSinceLastUpdate = currentTime - lastUpdateTime
    lastUpdateTime = currentTime
    if timeSinceLastUpdate > 1 {
        timeSinceLastUpdate = 1.0 / 60.0
        lastUpdateTime = currentTime
    }
    updateWithTimeSinceLastUpdate(timeSinceLastUpdate)
}

问题

我似乎无法弄清楚为什么 timeSinceLastUpdate 设置为 1.0 / 60。我知道这与帧速率和秒数之间的协调有关,但有人可以向我解释一下吗?另外,为什么我们可以使用小数?我认为时间间隔是 Int 类型的。

更重要的是,这样做的目的是为了防止游戏在帧速率下降时变慢吗?感谢阅读!

【问题讨论】:

    标签: xcode time swift sprite-kit xcode6


    【解决方案1】:

    SpriteKit 不知道一秒钟内会有多少帧,但它可以告诉你从完成上一帧的绘制到现在已经过去了多少时间 .如果您的游戏代码有任何时间相关的逻辑,这是您想知道的。例如,您可能正在执行类似position += velocity * timeSinceLastUpdate 之类的操作来移动精灵,因为您不需要成熟的物理引擎。

    帧率是每秒帧数:SpriteKit 尝试以每 1 秒 60 帧的速度运行您的游戏。这意味着帧之间的时间是 1 / 60 秒(大约 0.01667 秒,或 16.67 毫秒)。 CFTimeIntervalDouble 的类型别名,因此它可以具有非整数值(并且需要,因为您使用的帧时间只有几分之一秒)。

    更重要的是,这样做的目的是为了防止游戏在帧速率下降时变慢吗?

    关于帧率下降的部分正确,但效果是倒退的。如果帧速率显着下降,您实际上希望减慢游戏速度

    如果使用position += velocity * timeSinceLastUpdate 之类的代码将飞船在屏幕上移动,如果我们连续丢掉几帧会发生什么? timeSinceLastUpdate 的值会很高,所以船会跳很远,而不是移动一点点。如果您的应用暂停并稍后返回前台,这种情况尤其可能发生。

    此代码检查距离上一帧是否超过一秒,如果是,则选择继续游戏,就好像游戏以 60 fps 运行一样 - 避免了飞船跳跃问题。

    【讨论】:

    • 感谢您解释这个 Rickster!这绝对有助于澄清我的问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多