ios - 使用 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 是否根本无法在不冻结的情况下添加新节点,还是我错过了一些重要的东西?
相关问题:
解决方案
推荐阅读
- r - 这段代码计算R中向量之间的角度有什么问题
- swift - 如何将我的应用程序图标放入 iOS 警报窗口
- c++ - 保存包含字母和数字的输入时,它们将作为循环的两个不同迭代运行
- reactjs - 我在 Laravel Mix 中使用 React 路由器刷新浏览器时收到错误 404
- firebase - RN Firebase - Android 上的 okhttp3 版本不匹配
- node.js - 如何在每次提交时自动将服务器上的 git 存储库克隆到另一个文件夹
- java - 用循环中断程序
- bash - travis 成功后自动合并拉取请求
- swift - 使用断点Swift时查找变量的值
- c - 如何修复这些无效类型的参数(链表/结构)并确保它们不会再次发生?