在使用SceneKit时,update方法:
func renderer(aRenderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval)
该方法不在主线程上被调用,而是在其他线程上调用。
我应该在主线程上做什么?在这个“SceneKit线程”上应该做什么?
我应该在哪里添加新的节点/几何体?
修改这些对象的位置/等属性在哪里是安全的?
在使用SceneKit时,update方法:
func renderer(aRenderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval)
该方法不在主线程上被调用,而是在其他线程上调用。
我应该在主线程上做什么?在这个“SceneKit线程”上应该做什么?
我应该在哪里添加新的节点/几何体?
修改这些对象的位置/等属性在哪里是安全的?
这个问题涉及到Scenekit。即使您的操作是在主线程上进行的,节点/几何体实际上并没有被添加到主线程上。Scenekit不会在主线程上渲染。更改将被批处理到渲染线程。如果渲染是UI,那么它就不在主线程上。实际上,如果您在主线程上进行更改,则会收到错误的例外,因为渲染线程正在尝试渲染被删除的对象。这就是为什么在苹果香蕉游戏中,removefromparent位于SCNTransaction中的原因。因此,移除操作发生在渲染线程而不是主线程上。添加操作也以同样的方式批处理。它实际上并没有添加到主线程上。
因此,请注意同时存在一个渲染线程。如果您在主线程上对场景的rootnode进行枚举操作,您将从渲染线程中得到根节点的更改导致的崩溃。但由于事情发生得如此之快,所以这种情况可能相当罕见。总的来说,去查看香蕉游戏、狐狸游戏等,并了解它们如何使用。