繁体   English   中英

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

[英]SceneKit - Threads - What to do on which thread?

使用SceneKit时,更新方法:

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

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

我应该在主线程上做什么,以及必须在这个“SceneKit线程”上做些什么?

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

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

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

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

SCNSceneRendererDelegate的文档在这里这里似乎没有什么关于线程的说法,但是代理显然是在辅助线程上调用的,至少在macOS 10.11.6上(显然你所使用的iOS版本)。 有人可能会合理地假设,如果这给SceneKit带来了任何问题,那么文档现在已经相应地进行了修改。

Apple的Fox示例代码有一个渲染器委托,它对场景进行了许多更改,似乎不考虑任何其他线程可能达到的目标,并且从这一点可以合理地假设这样做对SceneKit没有任何问题。 (似乎Fox几乎完全是由渲染器委托驱动的,所以也许它没有理由担心多个线程。)

这可能是由于SceneKit的自动每线程事务,如此处所述 只要你在返回运行循环之前不需要可见效果,就好像你可以随时做任何你想做的事情。 这是我能找到的关于SceneKit的唯一文档,它以任何实质性方式提及线程。

以上都说,这对你自己的逻辑来说可能是个问题。 好消息是您注意到您的委托是在辅助线程上调用的。 如果您在项目的早期没有注意到这一点,那么坏消息是您可能需要做很多工作。

线程可以以各种方式同步。 你可能最好使用Apple的现代设施这样做,但是如果你发现自己处于紧张状态你可能还需要考虑其他各种较旧的方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM