¿Los niños de una escena no se liberan lo suficientemente rápido?

Tenga un par de nodos secundarios en una escena y realice una transición rápida a una nueva escena.

En la nueva escena, didMove(to view: ….) Se usa para agregar los niños de la escena anterior a esta escena siguiente.

SceneKit se bloquea al hacer esto rápidamente, al parecer porque los niños de la escena anterior aún no han sido lanzados.

Si agrego un pequeño retraso antes de agregar los niños a la segunda escena, está bien … parece que SpriteKit no está liberando al niño lo suficientemente rápido para la transición de la escena.

Lo anterior es lo más importante para entender con respecto al propósito de esta pregunta. Supongo (erróneamente) que SpriteKit se aseguraría de que todos los nodos conectados a una escena fueran liberados antes de intentar agregarlos a una escena posterior. No hace esto Pero los libera, solo toma un poco de time. ¿Es este un cuadro? ¿Un segundo? No sé…

El time de transición de mi escena es de 0.25 segundos

También intenté usar willMove(to view: ….) en la escena original para eliminar manualmente a los niños. Esto también no funciona, aparentemente el mismo comportamiento: no lo suficientemente rápido.

También probé suponiendo que el niño todavía tiene una relación con su padre, así que trató de moverse a su nuevo padre, la nueva escena, con el move(toParent:…) esto también se bloquea. Entonces, tal vez los niños ya están marcados para ser liberados, supongo.

¿Se conoce esto y, de ser así, cómo se trata?

No puede presentar una escena y tener la function willMove al mismo time en el mismo cuadro (bucle SK): la vista de su próxima escena se viewDidLoad la viewDidLoad de viewDidLoad antes de que se destruya la escena anterior. Debe eliminar todos los nodos antes de llamar a presentScene :

Sugiero hacer una variable global de algún tipo para acceder a su SKView ; con eso puedes tener control sobre tus escenas desde cualquier lugar:

 currentScene.removeAllChildren() gView!.presentScene(nextScene) 

"¿Se sabe esto y, de ser así, cómo se trata?"

, este es un problema conocido de los paradigmas de layout y operación de SceneKit y IOS. Se considera que siempre debe estar presente una escena y en la pantalla. No puedo tener time sin una escena en la pantalla.

Como resultado, durante un breve período de time durante las transiciones, ambas escenas se cargan y se activan.

Hay tres forms de hacer frente a este problema:

  • Elimine todo el contenido de la escena anterior antes de ejecutar la transición para que la nueva escena en didMove(to view... pueda cargar instantáneamente didMove(to view...

    o

  • Espere a que finalice la transición antes de cargar cualquier contenido de la escena anterior en la nueva escena para que no haya conflictos de propiedad de los niños.

    o

  • La primera sugerencia de .copy() para usar .copy() así que no hay las mismas instancias en las que las escenas pelean.