2017-09-24 5 views
1

Je construis une application ARKit + SceneKit qui nécessite d'afficher des modèles sur le monde réel. Chaque fois qu'un utilisateur sélectionne un bouton, le modèle change.Ajouter plusieurs nœuds à SceneKit SCNScene sans bloquer le thread principal

J'ai essayé de charger une nouvelle touche de modèle Apon dans un noeud et de l'ajouter au noeud racine de la scène, mais cela entraîne un gel de la caméra pendant quelques secondes jusqu'à ce qu'elle soit ajoutée à la scène. J'ai ensuite lu qu'il serait peut-être préférable de charger tous les nœuds au démarrage (viewDidLoad ou quelque chose comme ça), d'appeler la méthode prepare de la scène, puis d'ajouter les nœuds à la scène, mais cela gèle l'application plusieurs fois pendant quelques secondes jusqu'à ce que le processus soit terminé. C'est ce que je fais actuellement, et ça ne marche pas bien! Des idées?

Gardez à l'esprit les fichiers modèles sont assez lourds (~ 15 Mo chacun)

func addNodesToScene() { 
    for menuItem in self.menuItems { 
       let tempScene = SCNScene(named: menuItem.modelPath)! 
       let node = tempScene.rootNode 
       node.scale = SCNVector3Make(0.1, 0.1, 0.1) 
       node.isHidden = true 
       self.foodNodes[menuItem] = node 
       print("\(menuItem.title) node loaded") 
      } 

      print("done loading nodes - adding to scene") 
      self.sceneView.prepare(Array(self.foodNodes.values), completionHandler: { (success) in 
       for nNode in self.foodNodes.values { 
        self.sceneView.scene.rootNode.addChildNode(nNode) 
       } 
      }) 
} 

Répondre

1

La méthode de préparation prépare les modèles (et textures) à charger rapidement sur le GPU. Votre fonction combine essentiellement deux fonctions en une, en chargeant les noeuds à partir des fichiers .SCN et en les préparant pour le GPU. La méthode de préparation peut empêcher le bégaiement dans les jeux à haute fréquence de trame par exemple, cela ne va pas résoudre le chargement de modèles de 15 mb.

Si vous voulez charger des modèles de 15MB, vous allez sûrement avoir un délai quelque part. Un modèle de 15 Mo devrait fournir tellement de détails qu'un délai (au démarrage de l'application) serait acceptable. Si vous en avez besoin de plusieurs, le vrai problème ici est probablement la taille des modèles. Pouvez-vous poster un exemple?

+0

Il a effectivement atténué le problème, fonctionne plutôt bien. Quelques retards/gels, mais je peux mettre un peu d'écran statique de "chargement" pendant ce temps – royherma

+0

ça ne me dérange pas un délai, mais comme le thread principal est bloqué, je ne peux pas fournir de chargeur animé ou quelque chose comme ça , ce qui en fait un mauvais UX – royherma

+0

La méthode prepare s'exécute déjà sur un thread secondaire, mais peut-être essaie-t-elle d'exécuter manuellement la première boucle for sur un thread d'arrière-plan? Combien d'éléments de menu y a-t-il? Aussi, avez-vous vérifié quelle partie du code provoque le retard? (Chargement des scenefiles ou ajout des nœuds). Vous pourrez peut-être obtenir des performances en ajoutant tous les modèles à un seul fichier de scène. – Xartec