【问题标题】:On which thread does [SKScene update:] get called?[SKScene update:] 在哪个线程上被调用?
【发布时间】:2013-11-16 07:42:25
【问题描述】:

我正在使用 Sprite Kit 创建游戏,我的所有游戏代码都通过正在运行的 SKSceneupdate: 方法运行。我自己不创建任何其他线程。

据我了解,应用程序委托方法:

- (void)applicationWillResignActive:(UIApplication *)application
- (void)applicationDidEnterBackground:(UIApplication *)application
- (void)applicationWillEnterForeground:(UIApplication *)application
- (void)applicationDidBecomeActive:(UIApplication *)application

在主线程上运行。

如果在主线程上调用update:,我能否确定如果我更改正在运行的SKScene 的成员变量(当调用任何委托方法时),update: 方法将看到变化了吗?

上述任何委托方法是否有可能在update: 方法正在执行时执行,反之亦然?

编辑:委托方法和 [SKScene update:] 是否在同一个(主)线程上执行?

【问题讨论】:

    标签: ios objective-c uiapplicationdelegate sprite-kit


    【解决方案1】:

    我不是精灵专家,但总的来说: 两个方法永远不会在同一个线程中同时运行。

    当您的 [update:] 方法正在执行时,它会阻塞该线程以供其他执行(检查 NSRunLoop 机制)。因此,如果委托方法当时需要在该线程中执行,它将被安排到下一个运行循环周期。反之亦然。

    这里有一些很好的解释:Understanding NSRunLoop 并参考了 Apple 文档。

    【讨论】:

    • 你是说委托方法和sprite kit中的[SKScene update:]方法都在主线程上执行?
    • 是的,所有 UI 更新都在主线程中完成。您可以通过在方法中添加NSLog() 语句来轻松验证这一点,因为 NSLog 会自动指示每个日志中的线程。
    • 好的。我明白你在说什么。我仍然不明白一件事:如果委托方法和更新:方法都在主线程上运行,它是否保证这两种方法都会运行?或者如果调用了委托方法,是否意味着通常在运行循环上运行的其他方法都不会被调用?
    • 所有这些方法都将在主线程上执行,但不会同时执行。因此,当您的“更新:”方法仍在执行时,应用程序委托方法永远不会执行。单个线程一次只能执行一项工作(方法),其他人会等待,因为方法(尤其是在主线程上)通常只需要很短的执行时间。
    【解决方案2】:

    好的。我正在回答我自己的问题,因为我已经验证了我的答案

    1) 委托方法和[SKScene update:] 在主线程上执行。我通过调用[NSThread isMainThread] 验证了这一点,也因为 Xcode 在线程执行/调用堆栈窗口中显示线程名称

    2) 当应用处于非活动状态时,仍会调用更新,因此它是在下一个循环中调用还是在与applicationWillResignActive: 被调用时相同的循环中调用并不那么重要。

    3) 一旦applicationDidEnterBackground: 被执行,update: 就不会被调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-17
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多