モデルを現実世界に表示する必要がある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)
}
})
}
これは実際問題を緩和し、うまく機能します。いくつかの遅延/フリーズがありますが、その間にいくつかの静的な「読み込み中」の画面を置くことができます – royherma
遅延が気になりませんが、メインスレッドがブロックされているため、アニメーション化されたローダーなどを提供することはできませんこれは悪いUXのためになります – royherma
準備メソッドは、セカンダリスレッドではすでに実行されますが、おそらく最初のforループをバックグラウンドスレッドで手動で実行しようとしますか?いくつのメニュー項目がありますか?また、コードのどの部分が実際に遅延を引き起こしているかチェックしましたか? (Scenefilesのロードまたはノードの追加)。すべてのモデルを1つのシーンファイルに追加することで、パフォーマンスを得ることができます。 – Xartec