在ARKit中渲染新图像时如何清除内存?

时间:2019-06-27 03:37:32

标签: swift memory uiimage arkit

我第一次使用Swift ARKit,在我的渲染器didUpdate方法中,我为用户提供了更改正在渲染的图像的选项。当他们更改图像时,我将创建一个新图像(使用调整大小的图像),并将该图像用作faceGeometry节点的内容。问题是,无论何时发生这种情况,都会使内存使用量增加约50-100mb,如果他们这样做足够多次,则应用程序将崩溃。

如何在每次添加新图像时清除旧图像的内存?我是否错过了一步,还是不应该在didUpdate方法中更新/创建图像?

func renderer(
    _ renderer: SCNSceneRenderer,
    didUpdate node: SCNNode,
    for anchor: ARAnchor) {

    guard let faceGeometry = node.geometry as? ARSCNFaceGeometry,
        let faceAnchor = anchor as? ARFaceAnchor
        else { return }


    if imageChanged {
        let material = faceGeometry.firstMaterial!

            let resizedImg = resizeImage(image: primaryImage!, targetSize: CGSize(width: imageWidth, height: imageHeight))

            let expandedSize = CGSize(width: 1000, height: 1000)

            let imageOnBlueCanvas = drawImageOnCanvas(resizedImg, canvasSize: expandedSize, canvasColor: .clear, x: imageX, y: imageY)

            let v = UIImageView(image: imageOnBlueCanvas)

            material.diffuse.contents = v// Example texture map image.
            material.lightingModel = .physicallyBased


        imageChanged = false
    }


    faceGeometry.update(from: faceAnchor.geometry)

}

1 个答案:

答案 0 :(得分:0)

我通过对所有图像使用单个引用来解决此问题,并在创建新图像时更新了这些引用。这释放了旧的内存,我不再遇到内存溢出的情况。