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

In SpriteKit does touchesBegan run in the same thread as the SKScene update method?

此处的 Apple 文档 Advanced Scene Processing 描述了 update 方法以及场景的渲染方式,但未提及何时处理输入。不清楚这是和渲染循环在同一个线程,还是并发。

如果我有一个从 SKScene update 方法和 touchesBegan 方法(在本例中是 SKSpriteNode )更新的对象,我是否有担心同步对我的对象的两次访问?

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

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

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

在应用 运行 上,输出是:

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

每当我单击时都会重复此模式。

除了 touchesBegandidFinishUpdate(即一个循环的结束)和 update(循环的开始)之间调用下一个)。

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