我建立一個ARKit
+ SceneKit
應用程序,它需要在現實世界顯示模式。每次用戶選擇一個按鈕時,模型都會改變。添加到SceneKit SCNScene多個節點不阻塞主線程
我試圖加載APON按下按鈕一個新的模型轉換爲節點,然後將其添加到場景的根節點,但這會導致直到它被添加到場景相機凍結幾秒鐘。
然後我讀,這可能是更好的負載在啓動(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)
}
})
}
它實際上緩解了問題,工作得很好。一些延誤/凍結,但我可以把一些靜態的「加載」屏幕在此期間,而它確實是 – royherma
我不介意延遲,但由於主線程被阻塞,我不能提供任何動畫加載器之類的東西,這會導致用戶體驗不佳UX – royherma
prepare方法已在輔助線程上執行,但可能嘗試手動運行後臺線程上的第一個for循環?有多少菜單項?另外,您是否檢查代碼的哪一部分實際上會導致延遲? (加載scenefiles或添加節點)。您可以通過將所有模型添加到單個場景文件中來獲得一些性能。 – Xartec