Xcode SpriteKit';s更新功能:时间与帧率
一般来说,我对编程和Spritekit不太熟悉,我感兴趣的是探索毫秒和帧率之间的关系,以及如何使用更新函数作为两者之间的中介 帧速率vs.毫秒 从本质上讲,帧速率和时间之间的主要区别在于时间总是一致的,而帧速率不是(由于密集的图形处理过程,它可能会下降)。然而,时间通常是在SKScene的更新事件(称为每帧)期间检查和设置的,所以我试图弄清楚时间是如何正确计算的,而您不知道一秒钟将有多少帧 示例 我目前正在看一个太空射击游戏的更新事件,更新功能负责在生成另一个外星人之前计算时间间隔。您可以在此处查看完整代码: 问题 我似乎不明白为什么TimesInclastUpdate设置为1.0/60。我知道这与帧率和秒数之间的协调有关,但有人能给我解释一下吗?还有,为什么我们可以使用小数?我以为时间间隔是Int型的Xcode SpriteKit';s更新功能:时间与帧率,xcode,time,swift,sprite-kit,xcode6,Xcode,Time,Swift,Sprite Kit,Xcode6,一般来说,我对编程和Spritekit不太熟悉,我感兴趣的是探索毫秒和帧率之间的关系,以及如何使用更新函数作为两者之间的中介 帧速率vs.毫秒 从本质上讲,帧速率和时间之间的主要区别在于时间总是一致的,而帧速率不是(由于密集的图形处理过程,它可能会下降)。然而,时间通常是在SKScene的更新事件(称为每帧)期间检查和设置的,所以我试图弄清楚时间是如何正确计算的,而您不知道一秒钟将有多少帧 示例 我目前正在看一个太空射击游戏的更新事件,更新功能负责在生成另一个外星人之前计算时间间隔。您可以在此处
更重要的是,这样做的目的是为了防止游戏在帧速率下降时变慢吗?谢谢你的阅读 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)
}