Ios 如何在Swift中每隔X秒高效调用一个函数
我正在玩一款使用spriteKit和Swift的iOS游戏,我在更新角色位置时遇到了问题。我的计划是用一个简单的(x,y)坐标在屏幕顶部显示球员的位置,并让它每秒更新几次。我能够使用以下代码实现这一点:Ios 如何在Swift中每隔X秒高效调用一个函数,ios,multithreading,swift,timer,Ios,Multithreading,Swift,Timer,我正在玩一款使用spriteKit和Swift的iOS游戏,我在更新角色位置时遇到了问题。我的计划是用一个简单的(x,y)坐标在屏幕顶部显示球员的位置,并让它每秒更新几次。我能够使用以下代码实现这一点: updatePostimer = NSTimer.scheduledTimerWithTimeInterval(0.10, target: self, selector: Selector("updatePosition"), userInfo: nil, repeats: true) 问题是
updatePostimer = NSTimer.scheduledTimerWithTimeInterval(0.10, target: self, selector: Selector("updatePosition"), userInfo: nil, repeats: true)
问题是每次执行该方法时,屏幕上都会出现明显的延迟。updatePosition方法如下所示:
func updatePosition(){
positionLabel?.text = "X: " + String(Int(scene.player.position.x)) + " Y: " + String(Int(scene.player.position.y))
}
我不明白为什么这会滞后。我会在游戏场景更新方法中添加必要的代码,但由于这不是游戏的关键部分,所以我尝试在不同线程的计时器上运行此方法。如果有人对如何在不同的线程(主线程除外)上高效运行此方法,或者如何让它每秒执行几次而不产生帧延迟有任何建议,我肯定会很感激:)您应该利用SpriteKit的运行循环。SpriteKit将呼叫:
func update(currentTime: NSTimeInterval)
在每个渲染过程之前,以便您可以根据需要更新任何游戏状态。有关更多信息,请参阅。不建议使用NSTimer,因为计时器的触发不均匀(即系统认为方便时)。对于游戏状态更改,您希望这些更改与渲染引擎同步。有关sprite kit run loop的讨论,请参阅以及为什么NSTimer不适合动画,请参阅。将其主要放在后台线程上的结果是什么?我不确定如何在后台线程上运行它,我只是尝试让它独立于主更新循环运行(不确定它是否在同一线程上)我认为这与你更新的频率有关。尝试设置
NSTimer
以更新每个1/60
或每个1/fps
@C.Greene由于beyowulf指出的原因,您应该避免在SpriteKit中使用NSTimer。此外,NSTimer不尊重场景或视图的暂停状态,因此在暂停/取消暂停游戏时可能需要额外的处理。因此,正确的方法是update:method或SKAction(如果适合您的项目)。