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)
}
})
}
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
ç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
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