SpriteKit的更新函数:时间 vs 帧速率

11
我是编程和Spritekit的新手,想探究毫秒数与帧率之间的关系,以及update函数如何作为两者之间的中介。
帧率与毫秒数
实际上,帧率和时间之间的主要区别在于时间始终保持一致,而帧率却不然(由于图形处理程序过于繁重,可能会下降)。但是,通常在SKScene的update事件中检查和设置时间(每帧调用一次),因此我正在尝试弄清楚在不知道一秒钟有多少帧的情况下如何正确计算时间。
示例
我目前正在查看太空射击游戏的更新事件,在这个游戏中,update函数负责在生成另一个外星人之前计算时间间隔。您可以在此处查看完整代码: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。

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

1个回答

13

SpriteKit不知道在一秒钟内会有多少帧,但它可以告诉你自从上一帧完成绘制以来经过了多长时间。如果你的游戏代码有任何与时间相关的逻辑,这是你需要知道的事情。例如,你可能正在执行像position += velocity * timeSinceLastUpdate这样的操作来移动精灵,因为你不需要完整的物理引擎。

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

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

你对帧率下降的部分是正确的,但效果是相反的。实际上,如果帧率显著下降,你实际上想要减慢游戏速度

如果使用position += velocity * timeSinceLastUpdate这样的代码来移动飞船跨越屏幕,如果我们连续几个帧都丢失了会发生什么?timeSinceLastUpdate的值将非常高,因此飞船将跳跃而不是移动一点。如果你的应用程序被挂起并在稍后重新回到前台时,这种情况尤其容易发生。

这段代码检查上一帧是否已经超过1秒钟,如果是,则选择继续游戏,就好像游戏一直以60 fps的速度运行-避免飞船跳跃的问题。


谢谢你的解释,Rickster!这绝对有助于我澄清这个问题! - Tyler Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接