在SpriteKit中,touchesBegan方法和SKScene的update方法是否在同一个线程中运行?

7
在苹果的文档《高级场景处理》中,它描述了update方法和场景如何呈现,但它没有提到何时处理输入。不清楚这是否在与渲染循环相同的线程中进行,或者它是否与其并发。
如果我有一个对象,我从SKSceneupdate方法和touchesBegan方法(在这种情况下是SKSpriteNode)中更新它,那么我是否需要担心同步两个访问我的对象?

我不是完全确定,但我有99%的把握它会在主线程中,因为触摸事件是由主运行循环接收的。 - NobodyNada
我认为我们现在可以将其达到99.9%。感谢您的评论-它足以使用。 - rghome
1个回答

4

几天后仍然没有答案,我进行了一些实验。顺便说一下,这些测试是在模拟器上运行的,而不是在实际设备上,但我认为结果应该是相同的。

第一个测试,我在调试器中在 touchesBegan 上设置断点,并查看了堆栈跟踪。它似乎是从第一个线程和 main 循环中调用的 - 与其余逻辑相同的位置,因此这对于单线程方法来说看起来不错。

第二个测试,我覆盖了场景中提到的各种方法,在每个被调用的函数名称旁添加打印语句。然后我在 touchesBegan 方法中添加了一个打印语句。

运行应用程序后,输出结果如下:

update
didEvaluateActions
didSimulatePhysics
didApplyConstraints
didFinishUpdate
touchesBegan in scene
update
didEvaluateActions
didSimulatePhysics
didApplyConstraints
didFinishUpdate
update

每次我点击时,这种模式都会重复出现。

无论我点击多少次,除了 touchesBegan 在一个周期结束的 didFinishUpdate 和下一个周期的 update 之间被调用,我没有得到其他任何东西。

结论:在调用 update 方法之前,触摸处理发生在主循环中。因此,在这两个方法之间同步资源是不必要的。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - noodles
是的,但它没有提到触摸事件是在哪里处理的,这正是我想问的。 - rghome

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接