我正在构建一个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)
}
})
}
答案 0 :(得分:1)
准备方法准备将模型(和纹理)快速加载到GPU上。您的功能基本上将两个功能合二为一,从.SCN文件加载节点并为GPU准备它们。准备方法可以防止高帧率游戏中的断断续续,例如,它不会解决加载15 mb模型的问题。
如果您要加载15MB型号,您肯定会在某处遇到延迟。一个15MB的模型应该提供如此多的细节,以便延迟(启动应用程序时)是可以接受的。如果您需要多个,那么真正的问题可能是模型的大小。你能发一个例子吗?