SceneKit - 线程 - 在哪个线程上做什么?
SceneKit - Threads - What to do on which thread?
使用SceneKit时,更新方式:
func renderer(aRenderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval)
不是在主线程上调用,而是在其他线程上调用。
我应该在主线程上做什么,在这个"SceneKit thread"上必须做什么?
我应该在哪里添加新节点/几何图形?
在哪里修改这些对象的位置/等是安全的?
问题是关于scenekit的。 Nodes/geometry 实际上并没有添加到主线程上,即使您是在主线程上添加的。 Scenekit 不在主线程上渲染。更改被批处理到渲染线程。如果渲染是 UI,它不在主线程上。事实上,如果您在主线程上进行更改,您会得到糟糕的 exc,因为渲染线程正在尝试渲染被破坏的对象。这就是为什么 removefromparent 在苹果香蕉游戏中的 SCNTransaction 中。所以移除发生在渲染线程而不是主线程。添加以相同的方式进行批处理。它实际上并没有添加到主线程上。
所以请注意,同时有一个渲染线程在运行。如果您在主线程上使用 scene.rootnode 进行枚举,您将在渲染线程对根节点进行更改时崩溃。但由于事情发生得如此之快,它可能会非常罕见。一般去看看香蕉游戏,狐狸游戏,看看他们是怎么用的。
SCNSceneRendererDelegate here and here 的文档似乎对线程没什么好说的,但是委托显然是在辅助线程上调用的,至少在 macOS 10.11.6 上(显然 [= 的任何版本) 32=] 你在)。人们可能会合理地假设,如果这对 SceneKit 造成任何类型的问题,文档现在应该已经相应地进行了修改。
Apple 的 Fox 示例代码有一个渲染器委托,它对场景进行了许多更改,似乎不考虑任何其他线程可能在做什么,并且从这里可以合理地假设这样做不会造成任何问题对于 SceneKit。 (似乎 Fox 几乎完全由渲染器委托驱动,所以也许它没有理由担心多线程。)
这可能是由于 SceneKit 的自动每线程事务记录 here。听起来好像您可以随时随地做任何您想做的事,只要您不需要比 return 到 运行 循环更早的可见效果。这是我能找到的唯一一份以任何实质性方式提及线程的关于 SceneKit 的文档。
综上所述,这可能是一个巨大问题您自己的逻辑。好消息是您注意到您的委托在辅助线程上被调用。如果您在项目早期没有注意到这一点,那么坏消息是您可能有很多工作要做。
线程可以通过多种方式同步。您可能最好使用 Apple 的 modern facilities for doing so, but there is also a variety of other, older approaches 如果您发现自己陷入困境,您可能需要考虑一下。
使用SceneKit时,更新方式:
func renderer(aRenderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval)
不是在主线程上调用,而是在其他线程上调用。
我应该在主线程上做什么,在这个"SceneKit thread"上必须做什么?
我应该在哪里添加新节点/几何图形?
在哪里修改这些对象的位置/等是安全的?
问题是关于scenekit的。 Nodes/geometry 实际上并没有添加到主线程上,即使您是在主线程上添加的。 Scenekit 不在主线程上渲染。更改被批处理到渲染线程。如果渲染是 UI,它不在主线程上。事实上,如果您在主线程上进行更改,您会得到糟糕的 exc,因为渲染线程正在尝试渲染被破坏的对象。这就是为什么 removefromparent 在苹果香蕉游戏中的 SCNTransaction 中。所以移除发生在渲染线程而不是主线程。添加以相同的方式进行批处理。它实际上并没有添加到主线程上。
所以请注意,同时有一个渲染线程在运行。如果您在主线程上使用 scene.rootnode 进行枚举,您将在渲染线程对根节点进行更改时崩溃。但由于事情发生得如此之快,它可能会非常罕见。一般去看看香蕉游戏,狐狸游戏,看看他们是怎么用的。
SCNSceneRendererDelegate here and here 的文档似乎对线程没什么好说的,但是委托显然是在辅助线程上调用的,至少在 macOS 10.11.6 上(显然 [= 的任何版本) 32=] 你在)。人们可能会合理地假设,如果这对 SceneKit 造成任何类型的问题,文档现在应该已经相应地进行了修改。
Apple 的 Fox 示例代码有一个渲染器委托,它对场景进行了许多更改,似乎不考虑任何其他线程可能在做什么,并且从这里可以合理地假设这样做不会造成任何问题对于 SceneKit。 (似乎 Fox 几乎完全由渲染器委托驱动,所以也许它没有理由担心多线程。)
这可能是由于 SceneKit 的自动每线程事务记录 here。听起来好像您可以随时随地做任何您想做的事,只要您不需要比 return 到 运行 循环更早的可见效果。这是我能找到的唯一一份以任何实质性方式提及线程的关于 SceneKit 的文档。
综上所述,这可能是一个巨大问题您自己的逻辑。好消息是您注意到您的委托在辅助线程上被调用。如果您在项目早期没有注意到这一点,那么坏消息是您可能有很多工作要做。
线程可以通过多种方式同步。您可能最好使用 Apple 的 modern facilities for doing so, but there is also a variety of other, older approaches 如果您发现自己陷入困境,您可能需要考虑一下。