Max*_*Max 12 multithreading objective-c ios scenekit swift
使用SceneKit时,更新方法:
func renderer(aRenderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval)
Run Code Online (Sandbox Code Playgroud)
没有在主要的thead上调用,而是在其他一些线程上调用.
我应该在主线程上做什么,以及必须在这个"SceneKit线程"上做些什么?
我应该在哪里添加新的节点/几何?
修改这些对象的位置/等在哪里安全?
小智 8
问题是关于scenekit.即使在您执行此操作的位置,节点/几何体实际上也未添加到主线程上.Scenekit不在主线程上呈现.更改将批处理到呈现线程.如果渲染是UI,则它不在主线程上.实际上,如果你在主线程上进行更改,那么你会感觉不好,因为渲染线程正在尝试渲染被破解的对象.这就是为什么removefromparent在Apples香蕉游戏中的SCNTransaction中.因此删除发生在渲染线程而不是主线程上.添加以相同的方式进行批处理.它实际上并没有添加在主线程上.
所以请注意,有一个渲染线程同时进行.如果你在主线程上使用scene.rootnode进行枚举,你将从渲染线程中发生崩溃,从而对rootnode进行更改.但由于事情发生得如此之快,因此可能非常罕见.一般来看看香蕉游戏,狐狸游戏,看看他们如何使用它.
SCNSceneRendererDelegate的文档在这里和这里似乎没有什么关于线程的说法,但是代理显然是在辅助线程上调用的,至少在macOS 10.11.6上(显然你所使用的iOS版本).有人可能会合理地假设,如果这对SceneKit造成了任何问题,那么文档现在已经相应地进行了修改.
Apple的Fox示例代码有一个渲染器委托,它对场景进行了许多更改,似乎不考虑任何其他线程可能达到的目标,并且从这一点可以合理地假设这样做对SceneKit没有任何问题.(似乎Fox几乎完全是由渲染器委托驱动的,所以也许没有理由担心多个线程.)
这可能是由于SceneKit的自动每线程事务,如此处所述.只要你在返回运行循环之前不需要可见效果,就好像你可以随时做任何你想做的事情.这是我能找到的关于SceneKit的唯一文档,它以任何实质性方式提及线程.
以上都说,这对你自己的逻辑来说可能是个大问题.好消息是您注意到您的委托是在辅助线程上调用的.如果您在项目的早期没有注意到这一点,那么坏消息是您可能需要做很多工作.
线程可以以各种方式同步.您可能最好使用Apple的现代化设施,但如果您发现自己处于紧张状态,也可能需要考虑其他各种较旧的方法.
| 归档时间: |
|
| 查看次数: |
2301 次 |
| 最近记录: |