首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIImage到CVPixelBuffer内存问题

UIImage到CVPixelBuffer内存问题
EN

Stack Overflow用户
提问于 2017-05-26 02:55:57
回答 2查看 1.7K关注 0票数 2

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

我已经知道的是:

  1. 使用仪器,我在image.draw代码行中隔离了内存问题。它显示了大量的CGImage数据保存在内存中的时间。
  2. 我隔离了这个函数,所以我确信问题不是发生在它之外的事情(在调用者中),因为我从那里删除了所有的代码,内存也在不断增长。
  3. 我尝试将调用发送到此方法,但有些延迟,以便给系统分配时间,但它不起作用。
  4. 我尝试将代码的多个部分封装在自动释放池中,但仍然无法工作。
  5. 我尝试了主线程,utility.qos线程,等等,没有什么改变。
  6. 我在StackOverflow上阅读了其他所有的问题,但似乎其他人的解决方案在我的情况下行不通。

这是我的密码。任何帮助都是非常感谢的,因为我真的在这件事上大发雷霆。

代码语言:javascript
复制
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
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-28 02:36:23

我发现问题不是像素缓冲区,而是图像引用。

看起来(这只是基于这里的行为),当我在上下文中绘制图像时,很多图像像素数据存储在image.cgimage对象中。因此,我通过在每次调用该函数之后释放对图像的引用来解决问题,整个过程的内存都保持稳定。

票数 4
EN

Stack Overflow用户

发布于 2017-05-26 03:22:13

您需要删除您创建的引用,否则像素缓冲区将保持不变,然后在每次调用时创建一个新的引用。将ref放到像素缓冲区中,将其放回池中,以便在下一次调用时使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44192861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档