在不阻塞主线程的情况下向SceneKit SCNScene添加多个节点

时间:2017-09-24 20:43:35

标签: ios scenekit arkit scnnode

我正在构建一个ARKit + SceneKit应用,需要在现实世界中显示模型。每次用户选择按钮时,模型都会更改。

我尝试将新模型apon按钮加载到节点中,然后将其添加到场景的根节点,但这会导致相机冻结几秒钟,直到它被添加到场景中。

然后我读到最好在start(viewDidLoad或其他东西)上加载所有节点,调用场景的prepare方法,然后将节点添加到场景中,但这会导致应用程序冻结几次,持续几秒钟,直到完成该过程。这就是我目前正在做的事情,并且它运作良好!有任何想法吗?

请记住,模型文件很重(每个约15MB)

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

1 个答案:

答案 0 :(得分:1)

准备方法准备将模型(和纹理)快速加载到GPU上。您的功能基本上将两个功能合二为一,从.SCN文件加载节点并为GPU准备它们。准备方法可以防止高帧率游戏中的断断续续,例如,它不会解决加载15 mb模型的问题。

如果您要加载15MB型号,您肯定会在某处遇到延迟。一个15MB的模型应该提供如此多的细节,以便延迟(启动应用程序时)是可以接受的。如果您需要多个,那么真正的问题可能是模型的大小。你能发一个例子吗?