Ios GPUImage-混合太频繁时试图覆盖帧缓冲区

Ios GPUImage-混合太频繁时试图覆盖帧缓冲区,ios,swift,gpuimage,Ios,Swift,Gpuimage,使用GPUImageAlphaBlendFilter,我在UI中还有一个滑块,允许我更改组合。它工作得很好,我真的可以快速来回移动滑块,但如果滑动太快或滑动超过几秒钟,它通常会给我这个错误: 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“试图覆盖帧缓冲区,在使用-imageFromCurrentFramebuffer之前是否忘记调用-useNextFrameForImageCapture?” 它来自于GPUImage/framewor

使用
GPUImageAlphaBlendFilter
,我在
UI
中还有一个滑块,允许我更改组合。它工作得很好,我真的可以快速来回移动滑块,但如果滑动太快或滑动超过几秒钟,它通常会给我这个错误:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“试图覆盖帧缓冲区,在使用-imageFromCurrentFramebuffer之前是否忘记调用-useNextFrameForImageCapture?”

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

根据Brad Larson的说法,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)

  }
}

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

blendFilter = GPUImageAlphaBlendFilter()
blendFilter.useNextFrameForImageCapture()

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

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

有趣。所以我也试过了,但还是一样的错误。这会持续一段时间,但只有在我频繁移动滑块时才会出现错误。移动滑块效果很好。只要我快速移动几秒钟,它就会崩溃。几乎就像它不是线程安全的。这似乎改善了一点,但我仍然得到了一个版本。我正在使用gpuimageoverlyblendfilter将动态文本渲染到视频上。在更新我的源图片之前调用[filter useNextFrameForImageCapture]会导致断言传递的频率更高。