ios - 在 SpriteKit 中,touchesBegan 是否在与 SKScene 更新方法相同的线程中运行?

标签 ios multithreading sprite-kit touch-event touchesbegan

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

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

最佳答案

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

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

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

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

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

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

除了在 didFinishUpdate(即一个周期结束)和 updatetouchesBegan 之外,再多的点击也没有给我带来任何好处(下一个开始)。

结论:触摸处理发生在调用更新方法之前的主循环中。因此无需在这两种方法之间同步资源。

关于ios - 在 SpriteKit 中,touchesBegan 是否在与 SKScene 更新方法相同的线程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29755372/

相关文章:

java - 为什么这里的volatile和synchronized语句无法避免线程干扰呢?

ios - swinject 是否重新实例化对象?

ios - 从另一个对象调用时僵尸 NSString

haskell - 对于线程化Haskell调试,我最好的工具是什么?

python - 谁停止了我的线程?

ios - 在第二个 View Controller 中使用 GameScene 的分数

ios - 如何在SpriteKit中创建场景切换的无限滚动背景?

swift - 使用 PDF 来自 xcasset 的 "Error loading image resource'

ios - iTunes Connect:带有特殊字符的公司名称

ios - 是否有 ios 应用程序开发年龄分级官方定义页面?