2017-05-26 85 views
0

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

回答

0

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

+0

請將您的答案標記爲已接受 –

0

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

+0

嘗試像這樣:'var buffer = self.CreatePixelBufferFromImage(image); buffer = nil';它仍然不起作用。內存上升 – Axy

+0

請參閱http://en.swifter.tips/pointer-memory/ – MoDJ