SceneKit - 线程 - 如何处理哪个线程?

时间:2015-07-29 12:12:04

标签: ios objective-c multithreading swift scenekit

使用SceneKit时,更新方法:

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

不是在主要的thead上调用,而是在其他一些线程上调用。

我应该在主线程上做什么,以及在这个" SceneKit线程"

上需要做些什么?

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

修改这些对象的位置/等在哪里安全?

2 个答案:

答案 0 :(得分:8)

问题是关于scenekit。节点/几何体实际上并没有添加到主线程上,即使这样做也是如此。 Scenekit不在主线程上呈现。更改将批处理到呈现线程。如果渲染是UI,则它不在主线程上。实际上,如果你对主线程进行了更改,那么你会感觉不好,因为渲染线程正在尝试渲染被破解的对象。这就是为什么removefromparent在Apples香蕉游戏中的SCNTransaction中。因此删除发生在渲染线程而不是主线程上。添加以相同的方式进行批处理。它实际上没有添加到主线程上。

所以请注意,渲染线程同时进行。如果在主线程上使用scene.rootnode进行枚举,则会从渲染线程中发生崩溃,从而对根节点进行更改。但由于事情发生的速度很快,因此可能非常罕见。一般来看看香蕉游戏,狐狸游戏,看看他们如何使用它。

答案 1 :(得分:-3)

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