簡體   English   中英

UIImage到CVPixelBuffer內存問題

[英]UIImage to CVPixelBuffer memory issue

我有一個swift函數,它接受一個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
}

我發現問題不是pixelbuffer,而是圖像引用。
當我在上下文中繪制圖像時,很多圖像像素數據都存儲在image.cgimage對象中,看起來(這只是我的觀點基於此處的行為)。 所以我通過釋放我對每次調用此函數后繪制的圖像的引用來解決,並且內存對於所有進程保持穩定。

您需要刪除您創建的引用,否則像素緩沖區將保持不變,然后在每次調用時創建一個新的引用。 將ref放入像素緩沖區會將其放回池中,以便在下次調用時使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM