在SpriteKit中,touchesBegan在与SKScene更新方法相同的线程中运行吗?

rgh*_*ome 7 multithreading touchesbegan touch-event ios sprite-kit

在这里的Apple文档高级场景处理中,它描述了update方法以及如何渲染场景,但没有提到何时处理输入.目前尚不清楚它是否与渲染循环位于同一个线程中,或者它是否与它并发.

如果我有一个从SKScene update方法和touchesBegan方法更新的对象(在这种情况下为a SKSpriteNode),我是否要担心同步对象的两次访问?

rgh*_*ome 4

因此,几天后没有得到答案,我进行了一些实验。顺便说一句,这些测试是在模拟器上运行的,而不是在实际设备上运行的,但我认为它是相同的。

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

第二次测试,我覆盖了上面的高级场景处理链接中提到的场景中的各种方法,并添加了打印语句以显示所调用的每个函数的名称。然后我向该touchesBegan方法添加了一条打印语句。

运行应用程序时,输出为:

update
didEvaluateActions
didSimulatePhysics
didApplyConstraints
didFinishUpdate
touchesBegan in scene
update
didEvaluateActions
didSimulatePhysics
didApplyConstraints
didFinishUpdate
update
Run Code Online (Sandbox Code Playgroud)

每当我点击时,就会重复这种模式。

除了在(即一个周期的结束)和(下一个周期的开始)touchesBegan之间被调用之外,没有任何点击给我带来任何其他好处。didFinishUpdateupdate

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