如何在Swift中每隔X秒有效地调用一个函数

时间:2015-11-22 15:30:45

标签: ios multithreading swift timer

我正在玩一个使用spriteKit和Swift的iOS游戏,我无法更新角色位置。我的计划是让一个简单的(x,y)坐标显示屏幕顶部的玩家位置,并让它每秒更新几次。我能够使用以下代码实现这一点:

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))
}

我无法弄清楚为什么这是滞后的。我会在GameScene更新方法中放入必要的代码,但由于这不是游戏的关键部分,我试图在不同线程的计时器上运行此方法。如果有人有任何关于如何在不同的线程(除了主要)之外有效地运行此方法的建议,或者如何让它在没有帧延迟的情况下每秒执行几次,我肯定会很感激:)

1 个答案:

答案 0 :(得分:2)

你应该利用SpriteKit的运行循环。 SpriteKit会调用:

func update(currentTime: NSTimeInterval)
每次渲染过程之前

,以便您可以根据需要更新任何游戏状态。有关更多信息,请参阅SKScene Class Reference。不建议使用NSTimer,因为定时器不均匀地发射(即,只要系统发现它很方便)。对于游戏状态更改,您希望此类更改与呈现引擎同步。有关精灵套件运行循环的讨论,请参阅here以及为什么NSTimer不适合制作动画,请参阅here