【问题标题】:Loading huge animated 3D model in SceneKit causes memory issues在 SceneKit 中加载巨大的动画 3D 模型会导致内存问题
【发布时间】:2020-04-16 02:04:12
【问题描述】:

ARKit 有问题。我的 3D 模型是 197MB 的 DAE 格式(没有 20MB 的纹理)。当我尝试在没有纹理的情况下在SceneKit 中加载我的模型时,一切都很好,但是当我使用纹理加载它时,我的应用程序出现了内存问题。我的纹理文件在 100kB 到 4MB 之间。当加载纹理时,我的应用程序在我的手机 (iPhone X) 上使用 1.84 GB RAM,这会导致内存问题。我一直在互联网上搜索,但找不到任何解决方案。有人可以给我帮助或建议吗?

我的代码:

self.shipNode = SCNNode(daePath: "art.scnassets/s.scn")!

extension SCNNode {

    convenience init?(daePath: String) {

        self.init()

        guard let scene = SCNScene(named: daePath) else {
            return
        }

        DispatchQueue.main.async { [weak self] in
            for childNode in scene.rootNode.childNodes {
                self!.addChildNode(childNode)
            }
        }
    }
}

我是如何使用它的:

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {

    DispatchQueue.global().async { [weak self] in

        if let imageAnchor = anchor as? ARImageAnchor {
            let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width,
                                height: imageAnchor.referenceImage.physicalSize.height)

            plane.firstMaterial?.diffuse.contents = UIColor(white: 1, alpha: 0.8)
            self?.planeNode = SCNNode(geometry: plane)
            self?.planeNode.eulerAngles.x = -.pi / 2

            self?.shipNode.position = SCNVector3Zero
            self?.shipNode.position.z = 0.05

            DispatchQueue.main.async { [weak self] in

                self?.planeNode.addChildNode(self!.shipNode)

                self!.node.addChildNode(self!.planeNode)
            }
        }
    }
    return node
}

【问题讨论】:

  • 欢迎来到 Stack Overflow!我编辑了您的问题和正文的标题,以使其更易于阅读。我还更改了标签,以便更多了解该主题的人看到它。我还缩进了您的代码示例的格式,以便它正确呈现。祝你好运!

标签: swift scenekit augmented-reality arkit 3d-model


【解决方案1】:

高多边形模型具有巨大的纹理贴图不适合强大的 AR 体验。增强现实框架(例如 ARKit 或 ARCore)是处理器密集型的,因此无需额外增加 CPU、GPU 和内存的负担。

为什么 ARKit 应用如此占用 CPU 资源

您的 ARKit 应用使用 4 个传感器以 60 fps 的速度跟踪周围环境,并同时渲染(在 SceneKit 或 RealityKit 的帮助下)您的动画 3D 模型以及所有纹理、灯光和阴影,然后,它在来自后置摄像头的高分辨率 RGB 视频上实时合成模型的 2D 渲染(以 RGBAZ 模式)。这对您的设备来说太过分了,不是吗?

因此,任何具有巨大纹理的高多边形模型不仅会导致内存和 CPU/GPU 问题,而且会很快耗尽您的电池电量。并且,请注意 - iPhone X 只有 3 GB 的 RAM,而 iOS 使用的内存超过 1 GB,因此在您的特定情况下很有可能出现内存问题。

因此,我对创建 3D 模型以获得强大的 AR 体验的建议如下

  • 低多边形几何体(通常每个模型 10,000 个多边形都可以)
  • UV 映射纹理分辨率 - 不超过 1024 x 1024 像素
  • 最好为静态元素预烘焙 UV 映射阴影
  • 纹理使用 JPEG 格式,压缩率为 0%(PNG 较大)
  • 不要在你的场景中使用过多的 PBR 着色器(带有 metalness 属性)

【讨论】:

  • 感谢您的回复,如果您对 unity(Vuforia) 有任何经验,我会明白您的意思使用 arkit 我有问题
  • 我不确定,但我认为 Unity(安装了 Vuforia)减少了 3D 模型中的多边形数量(优化过程)。你能检查一下吗?
猜你喜欢
  • 2018-03-13
  • 2016-02-29
  • 2018-11-05
  • 2019-03-25
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多