SceneKit – Hilos – ¿Qué hacer en qué hilo?

Al usar SceneKit, el método de actualización:

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

no se llama en la pista principal, sino en algún otro hilo.

¿Qué se supone que debo hacer en el hilo principal y qué se debe hacer en este "hilo de SceneKit"?

¿Dónde debo agregar nuevos nodos / geometry?

¿Dónde es seguro modificar la position / etc de estos objects?

La pregunta es sobre scenekit. Los nodos / geometry no se agregan en el hilo principal, incluso si es allí donde lo haces. Scenekit no se muestra en el hilo principal. Los cambios se lotean al hilo de renderizado. Si la representación es la interfaz de usuario, no está en el hilo principal. De hecho, si realiza cambios en el subprocess principal, obtendrá un error grave porque el subprocess de representación está intentando representar el object que se atacó. Por eso, removefromparent está dentro de un juego SCNTransaction en manzanas banana. Entonces, la eliminación ocurre en el subprocess de renderizado no en el subprocess principal. La adición se divide de la misma manera. En realidad no se agrega en el hilo principal.

Entonces, ten en count que hay un hilo de renderizado al mismo time. Si haces una enumeración con scene.rootnode en el subprocess principal, obtendrás fallas del subprocess de renderizado que realizarán cambios en el nodo raíz. Pero como las cosas suceden tan rápido, probablemente sea bastante raro. En general, mira el juego de plátano, el juego de zorros, y mira cómo lo usan.

La documentation para SCNSceneRendererDelegate aquí y aquí parece no tener nada que decir acerca de subprocesss, y sin embargo, el delegado se invoca claramente en un subprocess secundario, al less en macOS 10.11.6 (y aparentemente cualquiera que sea la versión de iOS en la que se encuentre). Se podría razonablemente suponer que si esto hubiera planteado algún tipo de problema para SceneKit, la documentation habría sido revisada en consecuencia.

El código de ejemplo de Fox de Apple tiene un delegado de renderizado que realiza muchos cambios en la escena, aparentemente sin tener en count lo que cualquier otro hilo podría hacer, y desde este podría suponer razonablemente que hacerlo no plantea ningún problema para SceneKit . (También parece que Fox es expulsado casi por completo del delegado del procesador, por lo que tal vez tenga pocas razones para preocuparse por varios subprocesss).

Esto puede ser posible debido a las transactions automáticas por subprocess de SceneKit, tal como se documenta aquí . Parece que puede hacer lo que quiera siempre que lo desee, siempre y cuando no requiera efectos visibles antes de su return al ciclo de ejecución. Esta es la única documentation que pude encontrar sobre SceneKit que menciona subprocesss de cualquier manera sustantiva.

Lo anterior, dicho todo, esto podría ser un gran problema para su propia lógica . La buena noticia es que notó que su delegado está siendo invocado en un hilo secundario. Si no se dio count de esto al comienzo de su proyecto, la mala noticia es que puede tener mucho trabajo por hacer.

Los hilos pueden sincronizarse de diferentes maneras. Probablemente sea mejor usar las modernas instalaciones de Apple para hacerlo, pero también hay una variedad de otros enfoques más antiguos que es posible que desee considerar si se encuentra en una situación difícil.

Toda la actividad de la interfaz de usuario ocurre en el hilo principal. La actividad no UI debería suceder en el otro hilo. Un ejemplo sería get una image de internet, pero eso bloquearía el hilo principal porque entonces nada funcionaría. Entonces, haría eso en otro hilo. Debe agregar nuevos nodos / geometry en el hilo principal porque es parte de la interfaz de usuario. Y debe modificar las posiciones de estos objects en el hilo principal.