Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中每隔X秒高效调用一个函数_Ios_Multithreading_Swift_Timer - Fatal编程技术网

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

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) 问题是

我正在玩一款使用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))
}

我不明白为什么这会滞后。我会在游戏场景更新方法中添加必要的代码,但由于这不是游戏的关键部分,所以我尝试在不同线程的计时器上运行此方法。如果有人对如何在不同的线程(主线程除外)上高效运行此方法,或者如何让它每秒执行几次而不产生帧延迟有任何建议,我肯定会很感激:)

您应该利用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(如果适合您的项目)。