CIContext createCGImage утечка памяти? - PullRequest
0 голосов
/ 27 июня 2018

Я столкнулся с утечкой памяти. Согласно Профилировщику (с выделениями), это происходит в функции createCGImage CIContext. Я искал и находил подобные проблемы здесь на stackoverflow, но я еще не нашел решения. Я попытался обернуть его в автозапуск, но у меня все еще есть утечка памяти.

Как создать CGImage из CIContext без утечки памяти в swift4?

func session(_ session: ARSession, didUpdate frame: ARFrame) {
    // Only run when currentFrame is finished
    guard self.currentPixelBuffer == nil else { return } // , case .normal = frame.camera.trackingState
    self.currentPixelBuffer = frame.capturedImage

    guard let currentPixelBuffer = self.currentPixelBuffer else {return }

    let ciImage = CIImage(cvPixelBuffer: currentPixelBuffer).oriented(CGImagePropertyOrientation.init(UIDevice.current.orientation))

    let cgImage: CGImage? = self.context?.createCGImage(ciImage, from: ciImage.extent)
    // var cgImage: CGImage?
    // autoreleasepool { [weak self] () -> () in
    //     cgImage = self?.context?.createCGImage(ciImage, from: ciImage.extent)
    // }

    guard let unwrappedCgImage = cgImage else { return }
    let uiImage = UIImage.init(cgImage: unwrappedCgImage)

    let visionImage = VisionImage(image: uiImage)

    self.backgroundQueue.async {
        self.textDetector?.detect(in: visionImage, completion: { [weak self] (features, error) in
        ...

P.s. вот мое контекстное объявление:

var context: CIContext? = CIContext.init(options: nil)

1 Ответ

0 голосов
/ 28 июня 2018

Итак, проблема была в вызове self.textDetector? .Detect (in: visionImage ...). Он сохранил сильную ссылку на visionImage.

Мне не удалось это исправить, но я смог обойти эту проблему, позволив VisionImage учитывать поворот вместо того, чтобы сам поворачивать изображение ....

Я получил этот рабочий код:

func session(_ session: ARSession, didUpdate frame: ARFrame) {
    // Only run when currentFrame is finished
    guard self.currentPixelBuffer == nil else { return } // , case .normal = frame.camera.trackingState
    self.currentPixelBuffer = frame.capturedImage

    guard let currentPixelBuffer = self.currentPixelBuffer else { return }
    let visionImage = VisionImage(buffer: self.getCMSampleBuffer(pixelBuffer: currentPixelBuffer))

    let metadata = VisionImageMetadata()
    switch UIApplication.shared.statusBarOrientation {
    case .landscapeLeft:
        metadata.orientation = .bottomRight
    case .landscapeRight:
        metadata.orientation = .topLeft
    case .portrait:
        metadata.orientation = .rightTop
    case .portraitUpsideDown:
        metadata.orientation = .leftBottom
    default:
        metadata.orientation = .topLeft
    }

    visionImage.metadata = metadata

    self.backgroundQueue.async {
        self.textDetector?.detect(in: visionImage, completion: { [weak self] (features, error) in
...