ios - UIImage 到 CVPixelBuffer 内存问题

标签 ios swift memory-management uiimage cvpixelbuffer

我有一个快速函数,它接受 UIImage 并返回 CVPixelBuffer。多次运行该函数时,内存不断增长,导致崩溃。

我已经弄清楚了:

  1. 通过仪器,我隔离了 image.draw 代码行中的内存问题。它显示了一段时间内内存中保存的大量 CGImage 数据。
  2. 我隔离了该函数,因此我确信问题不在于函数外部(调用者中)发生的事情,因为我删除了其中的所有代码并且内存不断增长。
  3. 我尝试调度对此方法的调用,但有一些延迟,以便给系统时间来释放分配,但它不起作用
  4. 我尝试将代码的多个部分包装在 autoreleasepool 中,但仍然不起作用。
  5. 我在主线程、utility.qos 线程等上尝试过,没有任何变化
  6. 我阅读了 StackOverflow 上的所有其他问题,但其他人的解决方案似乎不适用于我的情况。

这是我的代码。感谢任何帮助,因为我真的很想解决这个问题。

fileprivate func CreatePixelBufferFromImage(_ image: UIImage) -> CVPixelBuffer?{

    let size = image.size;

    var pxbuffer : CVPixelBuffer?

    let status = CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, self.exportingAdaptor!.pixelBufferPool!, &pxbuffer)

    guard (status == kCVReturnSuccess) else{
        return nil
    }

    CVPixelBufferLockBaseAddress(pxbuffer!, CVPixelBufferLockFlags(rawValue: 0));
    let pxdata = CVPixelBufferGetBaseAddress(pxbuffer!);

    let rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    let context = CGContext(data: pxdata, width: Int(size.width),
                            height: Int(size.height), bitsPerComponent: 8, bytesPerRow: CVPixelBufferGetBytesPerRow(pxbuffer!), space: rgbColorSpace,
                            bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue);

    context?.translateBy(x: 0, y: image.size.height);
    context?.scaleBy(x: 1.0, y: -1.0);

    UIGraphicsPushContext(context!)
    image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height));
    //
    UIGraphicsPopContext()
    CVPixelBufferUnlockBaseAddress(pxbuffer!, CVPixelBufferLockFlags(rawValue: 0));

    return pxbuffer
}

最佳答案

我发现问题不是像素缓冲区,而是图像引用。
看起来(这只是我基于此处行为的观点)当我在上下文中绘制图像时,大量图像像素数据存储在 image.cgimage 对象中。因此,我通过在每次调用此函数后释放对我刚刚绘制的图像的引用来解决这个问题,并且内存在整个过程中保持稳定。

关于ios - UIImage 到 CVPixelBuffer 内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44192861/

相关文章:

ios - UIActionSheet 没有显示在 ios8 窗口中?

Swift - 返回此函数

主要基于 AJAX 调用构建的 iOS phonegap 应用

ios - 将值设置为 nil - swift/parse

ios - UITableViewDataSource 导致 libc++abi.dylib : terminating with uncaught exception of type NSException

ios - 将 nil 分配给保留的属性会释放与其关联的对象吗?

ios - 如何在 iOS 中发布 CGImageRef

memory - 无硬件支持的虚拟内存

ios - AFNetworking/NSURLSession创建100多个任务下载文件耗时较长

ios - 在 Firebase 上观察数据还是检查数组?