Xcode SpriteKit';s更新功能:时间与帧率

Xcode SpriteKit';s更新功能:时间与帧率,xcode,time,swift,sprite-kit,xcode6,Xcode,Time,Swift,Sprite Kit,Xcode6,一般来说,我对编程和Spritekit不太熟悉,我感兴趣的是探索毫秒和帧率之间的关系,以及如何使用更新函数作为两者之间的中介 帧速率vs.毫秒 从本质上讲,帧速率和时间之间的主要区别在于时间总是一致的,而帧速率不是(由于密集的图形处理过程,它可能会下降)。然而,时间通常是在SKScene的更新事件(称为每帧)期间检查和设置的,所以我试图弄清楚时间是如何正确计算的,而您不知道一秒钟将有多少帧 示例 我目前正在看一个太空射击游戏的更新事件,更新功能负责在生成另一个外星人之前计算时间间隔。您可以在此处

一般来说,我对编程和Spritekit不太熟悉,我感兴趣的是探索毫秒和帧率之间的关系,以及如何使用更新函数作为两者之间的中介

帧速率vs.毫秒

从本质上讲,帧速率和时间之间的主要区别在于时间总是一致的,而帧速率不是(由于密集的图形处理过程,它可能会下降)。然而,时间通常是在SKScene的更新事件(称为每帧)期间检查和设置的,所以我试图弄清楚时间是如何正确计算的,而您不知道一秒钟将有多少帧

示例

我目前正在看一个太空射击游戏的更新事件,更新功能负责在生成另一个外星人之前计算时间间隔。您可以在此处查看完整代码:

问题

我似乎不明白为什么TimesInclastUpdate设置为1.0/60。我知道这与帧率和秒数之间的协调有关,但有人能给我解释一下吗?还有,为什么我们可以使用小数?我以为时间间隔是Int型的


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

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

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

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

关于帧率下降的部分是正确的,但效果是反向的。如果帧速率明显下降,您实际上希望降低游戏速度

如果用
position+=velocity*timeSinceLastUpdate
这样的代码在屏幕上移动一艘宇宙飞船,如果我们连续丢几个帧会发生什么?
timeSinceLastUpdate
的值将非常高,因此飞船将跳跃一段较长的距离,而不是仅仅移动一点点。如果你的应用程序被挂起并在稍后某个时候返回前台,这种情况尤其可能发生


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

感谢您解释此佝偻病!这肯定有助于澄清我的问题!
// 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)
}