我有一个快速函数,它接受UIImage并返回一个CVPixelBuffer。当多次运行此函数时,内存不断增长,导致崩溃。
我已经知道的是:
这是我的密码。任何帮助都是非常感谢的,因为我真的在这件事上大发雷霆。
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
}发布于 2017-05-28 02:36:23
我发现问题不是像素缓冲区,而是图像引用。
看起来(这只是基于这里的行为),当我在上下文中绘制图像时,很多图像像素数据存储在image.cgimage对象中。因此,我通过在每次调用该函数之后释放对图像的引用来解决问题,整个过程的内存都保持稳定。
发布于 2017-05-26 03:22:13
您需要删除您创建的引用,否则像素缓冲区将保持不变,然后在每次调用时创建一个新的引用。将ref放到像素缓冲区中,将其放回池中,以便在下一次调用时使用。
https://stackoverflow.com/questions/44192861
复制相似问题