SceneKit – 线程 – 在哪个线程上做什么?

使用SceneKit时,更新方法:

func renderer(aRenderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval) 

是不是在主要的调用,但在其他线程。

我应该在主线程上做什么,在这个“SceneKit线程”上做什么?

我应该在哪里添加新的节点/几何?

修改这些对象的位置等是安全的吗?

问题是关于scenekit。 主线程上实际上并没有添加节点/几何体,即使这是您的操作。 Scenekit不在主线程上呈现。 更改被批处理到呈现线程。 如果渲染是UI,则不在主线程上。 事实上,如果你在主线程上进行了修改,你将会得到不好的反应,因为渲染线程正在尝试渲染被掩盖的对象。 这就是为什么removefromparent是在苹果香蕉游戏中的SCNTransaction里面。 所以删除发生在渲染线程而不是主线程。 添加批处理的方式相同。 它实际上并没有被添加到主线程中。

所以只要知道有一个渲染线程在同一时间。 如果在主线程上使用scene.rootnode进行枚举,则会从渲染线程中导致崩溃,从而对根节点进行更改。 但是,由于事情发生得太快,这可能会非常罕见。 一般来说,去看看香蕉游戏,狐狸游戏,看看他们是如何使用它。

SCNSceneRendererDelegate 在这里和这里的文档似乎没有什么可以说关于线程,但委托显然是在辅助线程,至less在macOS 10.11.6(显然是任何版本的iOS)上调用。 有人可能会合理地认为,如果这已经给SceneKit带来了任何问题那么现在的文档已经被相应地修改了。

苹果公司的Fox示例代码有一个渲染器代表,它对场景做了许多改变,看起来没有其他线程可能要做什么,从这一点可以合理地假设这样做对SceneKit没有任何问题。 (也好像Fox几乎完全由渲染器代表驱动,所以也许没有理由担心多个线程)。

这可能是由于这里logging的SceneKit的自动每线程事务。 听起来好像你可以随心所欲地做任何你想做的事情,只要你不需要任何早于返回到运行循环的可见效果。 这是我能find的有关SceneKit的唯一文档,它以任何实质性的方式提到了线程。

以上所有说,这可能是一个巨大的问题, 为自己的逻辑 。 好消息是,你注意到你的委托正在辅助线程上被调用。 如果你在项目早期没有注意到,坏消息是你可能有很多工作要做。

线程可以以各种方式同步。 您可能最好使用苹果的现代化设施 ,但如果您发现自己身处险境,还可能需要考虑其他各种各样的旧方法 。

所有UI活动都发生在主线程上。 非UI活动应该发生在另一个线程上。 一个例子就是要从互联网上获取图片,但是会阻塞主线程,因为那样什么都行不通。 所以,你会在另一个线程上做到这一点。 您应该在主线程上添加新节点/几何graphics,因为它是UI的一部分。 你应该修改这些对象在主线程上的位置。