Как очистить память при рендеринге нового изображения в ARKit? - PullRequest
0 голосов
/ 27 июня 2019

Я работаю с Swift ARKit впервые, и в моем методе рендеринга didUpdate я предоставляю пользователю возможность изменить отображаемое изображение. Когда они меняют изображение, я создаю новое изображение (используя изображение с измененным размером) и использую это изображение для содержимого узла faceGeometry. Проблема в том, что всякий раз, когда это происходит, он добавляет около 50-100 МБ к использованию памяти, и если они делают это достаточно много раз, приложение вылетает.

Как очистить память для старых изображений при каждом добавлении нового изображения? Я пропускаю шаг или мне не нужно обновлять / создавать изображение в методе 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 голосов
/ 27 июня 2019

Я решил, используя отдельные ссылки для всех моих изображений, и обновлял эти ссылки всякий раз, когда я создаю новое изображение.Это освобождает старую память, и я больше не получаю переполнение памяти.

...