GPUImage - 经常尝试混合时尝试过度释放帧缓冲区

时间:2014-11-26 03:35:32

标签: ios swift gpuimage

使用GPUImageAlphaBlendFilter,我在UI中还有一个滑块,允许我更改混合。它工作得很好,我可以快速前后移动滑块,但如果我滑得太快或滑动几秒钟,它会经常给我这个错误:

  

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'尝试过度释放帧缓冲区,在使用-imageFromCurrentFramebuffer之前,您是否忘记调用-useNextFrameForImageCapture?

它来自 GPUImage / framework / Source / GPUImageFramebuffer.m中的解锁功能:269

根据Brad Larson的Framebuffer Article,不需要显式地使用UseNextFrameForImageCapture,因为imageByFilteringImage已经处理了这个问题。但不知何故,framebuffercount正在失去同步,可能是因为它无法跟上快速的更新请求。

我想知道是否有些东西我做得不对。有什么想法吗?

以下代码基本上是这样做的:
1.首先调用设置过滤器以获得所有设置 2.当滑块移动时,使用滑块调用applyAndGetCIImage

public class StylePhotoFilter: PhotoFilter {
  var blendFilter: GPUImageAlphaBlendFilter!
  var originalImage: UIImage!
  var styledImage: UIImage!
  var styledImageSource: GPUImagePicture!

  override func setupFilter() {

    // setup the filters
    blendFilter = GPUImageAlphaBlendFilter()

    // setting up the image to edit
    if(uiImage == nil) {
      let context = CIContextManager.sharedInstance
      let cgiImgRef = context.createCGImage(inputImage, fromRect: inputImage.extent())
      originalImage = UIImage(CGImage: cgiImgRef)
    } else {
      originalImage = uiImage!
    }

    // apply the style fully
    // styledImage = // I created this image earlier, we can assume it works

    // add target photo
    styledImageSource = GPUImagePicture(image: styledImage)
    styledImageSource.addTarget(blendFilter, atTextureLocation: 0)

  }

  public override func applyAndGetCIImage(sliderVal: Float) -> CIImage! {
    // set the mix
    blendFilter.mix = sliderVal

    // blend it
    // blendFilter.useNextFrameForImageCapture() // According to Brad Larson, this is no longer needed, as imageByFilteringImage does this for you
    styledImageSource.processImage()
    let blendedImage = blendFilter.imageByFilteringImage(originalImage)

    return CIImage(image: blendedImage)

  }
}

2 个答案:

答案 0 :(得分:2)

方法useNextFrameForImageCapture应该应用于过滤,但不应用于图片。

blendFilter = GPUImageAlphaBlendFilter()
blendFilter.useNextFrameForImageCapture()

答案 1 :(得分:0)

我不确定这是否会对您有所帮助,但我也看到了这个问题并将此代码添加到主循环并修复了它。引用计数似乎存在问题。

GPUImageFramebuffer* fb = self.filter.framebufferForOutput;
[fb disableReferenceCounting];