SpriteKit的更新功能:时间与帧速率

时间:2014-08-13 21:44:25

标签: xcode time swift sprite-kit xcode6

我一般都是编程和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类型。

更重要的是,这是为了保持游戏玩法在帧速率下降时减速?谢谢你的阅读!

1 个答案:

答案 0 :(得分:10)

SpriteKit在一秒钟内不知道将会有多少帧,但是它可以告诉你已经过了多少时间因为它已完成绘制前一帧。如果您的游戏代码具有任何与时间相关的逻辑,那么您就会想知道这一点。例如,你可能正在做position += velocity * timeSinceLastUpdate这样的事情来移动精灵,因为你不需要一个完整的物理引擎。

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

  

更重要的是,这是为了保持游戏玩法在帧速率下降时减速?

你有关于帧率下降的部分,但效果是向后的。如果帧率显着下降,你实际上想要减慢游戏速度

如果使用像position += velocity * timeSinceLastUpdate之类的代码在屏幕上移动一艘宇宙飞船,如果我们连续丢弃几帧,会发生什么? timeSinceLastUpdate的值非常高,所以船会跳得很远而不是稍微移动一下。如果您的应用程序被暂停并在以后某个时间返回到前台,则尤其可能发生这种情况。

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