首页 > 解决方案 > 使用 SCNSceneRender prepareObjects:withCompletionHandler 时如何避免严重的帧率下降:

问题描述

我正在使用 ARKit + SceneKit 开发 iOS AR 应用程序。用户可以从 3D 模型列表中进行选择,然后将其放置在 AR 场景中。它与这个 Apple ARKit 示例应用程序非常相似。

值得一提的是,我的 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 示例应用程序中的行为完全相同。

我在这里发现了一些类似的问题,但在按需加载用户启动的 3D 模型时没有解决方案。

SceneKit 是否根本无法在不冻结的情况下添加新节点,还是我错过了一些重要的东西?

相关问题:

如何在不阻塞主线程的情况下添加 SCNNodes?

限制后台线程上的 CPU 使用率

SceneKit - 向场景添加新的 SCNNode 会导致严重滞后

标签: iosscenekitarkit

解决方案


推荐阅读