2017-09-24 15 views
1

モデルを現実世界に表示する必要があるARKit + SceneKitアプリを構築しています。ユーザーがボタンを選択するたびに、モデルが変更されます。メインスレッドをブロックせずにSceneKit SCNSceneに複数のノードを追加

新しいモデルのaponボタンをノードにロードしてからシーンのルートノードに追加しようとしましたが、シーンに追加されるまで数秒間フリーズします。

次に、開始時にすべてのノード(viewDidLoadなど)をロードし、シーンのprepareメソッドを呼び出してノードをシーンに追加する方がよいかもしれないことを読んだが、これによりアプリが数回フリーズするプロセスが完了するまで数秒間待ってください。これは私が現在やっていることであり、うまくいきません!何か案は?

は、モデルファイルは非常に重い心に留めておいてください(〜15メガバイトごと)

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上に高速にロードするための準備します。あなたの関数は基本的に2つの関数を1つに結合し、.SCNファイルからノードをロードし、それらをGPU用に準備します。準備メソッドは、高フレームレートゲームでのスタッターを防ぐことができます。例えば、ロード15Mバイトモデルを解決することはできません。

15MBのモデルをロードする場合は、どこかで遅延が発生する可能性があります。 15MBのモデルは、(アプリを起動している間に)遅延が許容されるほどの詳細を提供する必要があります。その複数が必要な場合は、実際の問題はおそらくモデルのサイズです。あなたは例を投稿できますか?

+0

これは実際問題を緩和し、うまく機能します。いくつかの遅延/フリーズがありますが、その間にいくつかの静的な「読み込み中」の画面を置くことができます – royherma

+0

遅延が気になりませんが、メインスレッドがブロックされているため、アニメーション化されたローダーなどを提供することはできませんこれは悪いUXのためになります – royherma

+0

準備メソッドは、セカンダリスレッドではすでに実行されますが、おそらく最初のforループをバックグラウンドスレッドで手動で実行しようとしますか?いくつのメニュー項目がありますか?また、コードのどの部分が実際に遅延を引き起こしているかチェックしましたか? (Scenefilesのロードまたはノードの追加)。すべてのモデルを1つのシーンファイルに追加することで、パフォーマンスを得ることができます。 – Xartec

関連する問題