在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
(下一个的开始)之间被调用。
结论:在更新方法被调用之前,触发处理发生在主循环中。 因此没有必要在两种方法之间同步资源。