我正在使用ARKit + SceneKit开发iOS AR应用程序。用户可以从3D模型列表中进行选择,然后将其放置在AR场景中。与this Apple ARKit sample app非常相似。
值得一提的是,我的应用程序不仅包含几个模型,还包含数百个模型。因此,将它们全部预加载可能不是一个好主意。按需加载这些模型时,我的代码如下:
let modelURL = Bundle.main.url(forRessource: "MyModel", ofType: "scn")
let referenceNode = SCNReferenceNode(url: modelURL)
DispatchQueue.global(qos: .background).async {
referenceNode.load()
self.prepare([referenceNode]) { _ in
self.scene.rootNode.addChildNode(referenceNode)
}
}
呼叫referenceNode.load()
不会引起任何问题。一切都在后台顺利处理。但是调用self.prepare([referenceNode])
会导致帧速率立即下降到0
一到两秒钟(取决于模型本身)。删除prepare
语句时,调用self.scene.rootNode.addChildNode(referenceNode)
时也会发生同样的事情。
我注意到Apple sample app中的行为完全相同。
我在这里发现了一些类似的问题,但是在按需加载用户启动的3D模型时没有解决方案。
SceneKit是否完全不能在不冻结的情况下添加新节点,或者我缺少必要的内容?
相关问题:
How to add SCNNodes without blocking main thread?
Throttle CPU usage on background thread
SceneKit - Adding a new SCNNode to the scene causes severe lag