在SpriteKit中,touchesBegan和SKScene更新方法在同一个线程中运行吗?

在这里的Apple文档中, 高级场景处理描述了update方法以及如何渲染场景,但是没有提及何时处理input。 不清楚它是否与渲染循环处于同一个线程中,或者与渲染循环是否一致。

如果我有一个对象,我从SKScene update方法和touchesBegan方法update (在这种情况下的SKSpriteNode ),我必须担心同步两个访问到我的对象吗?

所以经过几天没有答案,我做了一些实验。 顺便说一下,这些testing是在模拟器上运行,而不是在实际的设备上运行,但我认为这是相同的。

首先testing,在touchesBegan的debugging器中设置一个断点,并查看堆栈跟踪。 看起来, touchesBegan从第一个线程和main循环被调用 – 与逻辑的其余部分相同的地方,所以这对于单线程方法看起来很好。

第二个testing,我将覆盖上面的高级场景处理链接中提到的场景中的各种方法,并添加打印语句来显示每个调用的函数的名称。 然后我在touchesBegan方法中添加了一个print语句。

在运行应用程序,输出是:

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

每当我点击的时候都会重复这个模式。

除了touchesBegan之外touchesBegan没有任何点击让我在didFinishUpdate (即一个循环的结束)和update (下一个的开始)之间被调用。

结论:在更新方法被调用之前,触发处理发生在主循环中。 因此没有必要在两种方法之间同步资源。