【问题标题】:CIImage and CIDetector use with AVCaptureOutput memory leakCIImage 和 CIDetector 与 AVCaptureOutput 内存泄漏一起使用
【发布时间】:2017-03-01 17:56:04
【问题描述】:

我正在使用 CIContext、CIDetector 和 CIImage 来检测从 captureOutput:didOutputSampleBuffer:fromConnection: 中的样本派生的 vImage_Buffer 中的矩形。似乎检测器或 CIImage 正在保留内存并且无法释放。 这是有问题的代码 - 跳过此代码会显示内存保持不变,否则会增加直到应用程序崩溃:

// ...rotatedBuf and format managed outside scope

// Use a CIDetector to find any potential subslices to process
CVPixelBufferRef cvBuffer;
vImageCVImageFormatRef cvFormat = vImageCVImageFormat_CreateWithCVPixelBuffer(pixelBuffer);
CVPixelBufferCreate(kCFAllocatorSystemDefault, rotatedBuf.width, rotatedBuf.height, kCVPixelFormatType_32BGRA, NULL, &cvBuffer);
CVPixelBufferLockBaseAddress(cvBuffer, kCVPixelBufferLock_ReadOnly);
err = vImageBuffer_CopyToCVPixelBuffer(&rotatedBuf, &format, cvBuffer, cvFormat, NULL, kvImageNoFlags);
CVPixelBufferUnlockBaseAddress(cvBuffer, kCVPixelBufferLock_ReadOnly);
if (![self vImageDidError:err]) {
    CIImage *ciImage = [CIImage imageWithCVPixelBuffer:cvBuffer];
    NSArray *feats = [self.ciDetector featuresInImage:ciImage options:nil];
    if (feats && [feats count]) {
        for (CIFeature *feat in feats) {
            // The frame is currently in image space, so we must convert it to a unitless space like the other rects.
            CGRect frame = feat.bounds;
            CGRect clip  = CGRectMake(frame.origin.x / rotatedBuf.width, frame.origin.y / rotatedBuf.height,
                                      frame.size.width / rotatedBuf.width, frame.size.height / rotatedBuf.height);
            rects = [rects arrayByAddingObject:[NSValue valueWithCGRect:clip]];
        }
    }
}
CVPixelBufferRelease(cvBuffer);
vImageCVImageFormat_Release(cvFormat);

其他答案似乎建议包装在自动释放池中或每帧创建一个新的 CIDector,但都不影响内存使用。

CIDetector isn't releasing memory

CIDetector won't release memory - swift

编辑:将调度队列切换到 dispatch_main_queue 以外的队列似乎已经清除了内存问题并保持 UI 响应。

【问题讨论】:

  • 我认为这是一个非常相似的问题,但需要不同的答案。我认为我遇到的问题有不同的原因,即使它显示相同的症状。不过,这是否是一个不同的问题取决于您!
  • 好吧,我想出了一个不同的解决方案——在我的情况下,我在主调度队列上运行所有处理。解决这种情况的方法是创建一个新队列来运行处理。我意识到当我的大部分 CPU 时间都花在调用 featuresInImage: 上时,可能就是这种情况。它没有解释导致内存问题的原因,但现在我在后台线程中运行,内存很好且恒定。
  • 好吧,我将重新打开您的问题,以便您将其作为答案。

标签: ios memory-leaks avcapturesession core-image


【解决方案1】:

我想出了一个不同的解决方案 - 在我的情况下,我在主调度队列上运行我的所有处理。解决这种情况的是创建一个新队列来运行处理。我意识到当我的大部分 CPU 时间都花在对 featuresInImage:options: 的调用上时,可能就是这种情况。它没有解释导致内存问题的原因,但现在我在一个单独的队列中运行,内存很好且恒定。

【讨论】:

    猜你喜欢
    • 2014-04-03
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2011-10-16
    相关资源
    最近更新 更多