我是编程和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类型的。
更重要的是,这样做的目的是在帧频下降时防止游戏速度减慢吗?谢谢阅读!
最佳答案
SpriteKit不知道一秒钟内将有多少帧,但是它可以告诉您自从完成绘制前一帧以来已经花费了多少时间。如果您的游戏代码具有任何与时间相关的逻辑,这是您想知道的。例如,您可能需要执行position += velocity * timeSinceLastUpdate
之类的操作来移动 Sprite ,因为您不需要成熟的物理引擎。
帧速率是每秒的帧数:SpriteKit尝试以1秒钟60帧的速度运行游戏。这意味着帧之间的时间为1/60秒(约0.01667秒或16.67毫秒)。 CFTimeInterval
是Double
的类型别名,因此它可以具有非整数值(并且需要这样做,因为使用的帧时间为几分之一秒)。
您已经了解了正确的帧速率下降部分,但是效果是向后的。如果帧速率大幅下降,您实际上想减慢游戏速度。
如果使用position += velocity * timeSinceLastUpdate
这样的代码在屏幕上移动一艘 spaceship ,如果我们连续放下几帧会发生什么? timeSinceLastUpdate
的值将非常高,因此船将跳远距离而不是稍微移动。如果您的应用被暂停并在稍后的某个时间回到前台,则这种情况尤其可能发生。
该代码检查自上一帧以来是否已超过一秒钟,如果是,则选择继续游戏,就像游戏以60 fps的速度运行一样-避免了跳飞飞船的问题。
关于xcode - SpriteKit的更新函数: time vs.帧速率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25296705/