【问题标题】:In SpriteKit does touchesBegan run in the same thread as the SKScene update method?在 SpriteKit 中,touchesBegan 是否与 SKScene 更新方法在同一线程中运行?
【发布时间】:2015-06-27 14:53:25
【问题描述】:

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

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

【问题讨论】:

  • 我不完全确定,但我有 99% 的把握它会在主线程中,因为主运行循环会接收到触摸事件。
  • 我认为我们现在可以达到 99.9%。感谢您的评论 - 使用起来已经足够好了。

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


【解决方案1】:

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

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

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

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

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

每次点击都会重复这种模式。

didFinishUpdate(即一个周期的结束)和update(下一个周期的开始)之间调用touchesBegan 之外,没有任何点击量。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
相关资源
最近更新 更多