2017-09-24 83 views
1

我建立一個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) 
       } 
      }) 
} 

回答

1

的準備方法準備的車型(和紋理)被快速加載到GPU。您的功能基本上將兩個功能合併爲一個,從.SCN文件加載節點併爲GPU進行準備。該準備方法可以防止在高幀率遊戲中出現口吃,例如,它無法解決加載15 MB模型的問題。

如果你要加載,你一定在哪兒找個延遲15MB車型。一個15MB的模型應該提供如此多的細節,以至於延遲(在啓動應用程序時)是可以接受的。如果你需要多個,那麼真正的問題可能就是模型的大小。你能舉一個例子嗎?

+0

它實際上緩解了問題,工作得很好。一些延誤/凍結,但我可以把一些靜態的「加載」屏幕在此期間,而它確實是 – royherma

+0

我不介意延遲,但由於主線程被阻塞,我不能提供任何動畫加載器之類的東西,這會導致用戶體驗不佳UX – royherma

+0

prepare方法已在輔助線程上執行,但可能嘗試手動運行後臺線程上的第一個for循環?有多少菜單項?另外,您是否檢查代碼的哪一部分實際上會導致延遲? (加載scenefiles或添加節點)。您可以通過將所有模型添加到單個場景文件中來獲得一些性能。 – Xartec