ios - 如何在 Swift 中每 X 秒高效地调用一个函数

标签 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 更新方法中,但由于这不是游戏的关键部分,因此我尝试在不同线程中的计时器上运行此方法。如果有人对如何在不同线程(主线程除外)上有效运行此方法,或者如何让它在没有帧延迟的情况下每秒执行几次有任何建议,我肯定会很感激:)

最佳答案

您应该利用 SpriteKit 的运行循环。 SpriteKit 将调用:

func update(currentTime: NSTimeInterval)

在每次渲染过程之前,您可以根据需要更新任何游戏状态。欲了解更多信息,请参阅SKScene Class Reference 。不建议使用 NSTimer,因为计时器的触发不均匀(即每当系统发现方便时)。对于游戏状态更改,您希望此类更改与渲染引擎同步。有关 Sprite 套件运行循环的讨论,请参阅 here以及为什么 NSTimer 不适合动画,请参阅 here .

关于ios - 如何在 Swift 中每 X 秒高效地调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33856531/

相关文章:

ios - 如何将图像添加到 UITableView 单元格?

php - 只允许通过应用程序访问 PHP 文件

java - 如果其他线程正在等待,线程是否会隐式调用 notifyAll() ?

linux - 有多少个进程可以在后台并行运行

c++ - 在带有 std::ref 的 std::thread 中使用地址清理调用 std::invoke(std::forward(...)) 时的奇怪行为

swift - 从 Collection View 执行segue

ios - Objective-c 如何对 textField 进行验证

ios - flatMap 是 Swift 中字典的字典

json - 解码 JSON 对象(发送带参数的 GET 请求) - Swift 4 Decodable

ios - Cocoapods 测试链接器错误