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

时间:2015-04-20 18:14:55

标签: ios multithreading sprite-kit touch-event touchesbegan

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

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

1 个答案:

答案 0 :(得分:4)

所以几天后没有回答我设置了一些实验。顺便说一句,这些测试是在模拟器上运行而不是在实际设备上运行,但我认为它们是相同的。

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

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

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

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

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

touchesBegan(即一个周期结束)和didFinishUpdate(下一个周期的开头)之间调用update之外,没有其他任何内容给我提供任何其他内容

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