使用SCNSceneRender prepareObjects:withCompletionHandler时如何避免严重的帧速率下降:

时间:2019-02-13 14:43:39

标签: ios scenekit arkit

我正在使用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

0 个答案:

没有答案