UIImage 到 CVPixelBuffer 内存问题
UIImage to CVPixelBuffer memory issue
我有一个 swift 函数,它接受一个 UIImage 和 returns 一个 CVPixelBuffer。 运行多次执行此函数时,内存不断增长,导致崩溃。
我已经想通了:
- 通过仪器,我在 image.draw 行代码中找出了内存问题。它显示了随着时间的推移内存中保存的大量 CGImage 数据。
- 我隔离了这个函数,所以我确定问题不在于它之外发生的事情(在调用者中),因为我从那里删除了所有代码并且内存不断增长。
- 我尝试分派对此方法的调用,但有一些延迟,以便为系统腾出时间来解除分配,但它不起作用
- 我尝试将多部分代码包装在自动释放池中,但仍然无法正常工作。
- 我在主线程、utility.qos 线程等上尝试过,没有任何变化
- 我阅读了 Whosebug 上的所有其他问题,但看起来其他人的解决方案不适用于我的情况。
这是我的代码。感谢您的帮助,因为我真的在努力解决这个问题。
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
}
您需要删除您创建的引用,否则像素缓冲区将保持保留状态,然后在每次调用时创建一个新的。将 ref 放入像素缓冲区会将其放回池中,以便在下一次调用时使用。
我发现问题不是像素缓冲区,而是图像引用。
看起来(这只是我基于此处行为的看法)当我在上下文中绘制图像时,大量图像像素数据存储在 image.cgimage
对象中。所以我通过在每次调用这个函数后释放我刚刚绘制的图像的引用来解决,并且内存在整个过程中保持稳定。
我有一个 swift 函数,它接受一个 UIImage 和 returns 一个 CVPixelBuffer。 运行多次执行此函数时,内存不断增长,导致崩溃。
我已经想通了:
- 通过仪器,我在 image.draw 行代码中找出了内存问题。它显示了随着时间的推移内存中保存的大量 CGImage 数据。
- 我隔离了这个函数,所以我确定问题不在于它之外发生的事情(在调用者中),因为我从那里删除了所有代码并且内存不断增长。
- 我尝试分派对此方法的调用,但有一些延迟,以便为系统腾出时间来解除分配,但它不起作用
- 我尝试将多部分代码包装在自动释放池中,但仍然无法正常工作。
- 我在主线程、utility.qos 线程等上尝试过,没有任何变化
- 我阅读了 Whosebug 上的所有其他问题,但看起来其他人的解决方案不适用于我的情况。
这是我的代码。感谢您的帮助,因为我真的在努力解决这个问题。
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
}
您需要删除您创建的引用,否则像素缓冲区将保持保留状态,然后在每次调用时创建一个新的。将 ref 放入像素缓冲区会将其放回池中,以便在下一次调用时使用。
我发现问题不是像素缓冲区,而是图像引用。
看起来(这只是我基于此处行为的看法)当我在上下文中绘制图像时,大量图像像素数据存储在 image.cgimage
对象中。所以我通过在每次调用这个函数后释放我刚刚绘制的图像的引用来解决,并且内存在整个过程中保持稳定。