ios - GPUImage - 尝试在混合过于频繁时过度释放帧缓冲区

标签 ios swift gpuimage

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

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to overrelease a framebuffer, did you forget to call -useNextFrameForImageCapture before using -imageFromCurrentFramebuffer?

来自GPUImage/framework/Source/GPUImageFramebuffer.m:269中的解锁函数

根据 Brad Larson 的 Framebuffer Article , useNextFrameForImageCapture 不是明确需要的,因为 imageByFilteringImage 已经解决了这个问题。但不知何故,帧缓冲区计数不同步,可能是因为它跟不上快速更新请求。

我想知道我是否做错了什么。有什么想法吗?

下面的代码基本上是这样做的:
1. 首先调用设置过滤器来设置所有内容
2. 当 slider 移动时,applyAndGetCIImage 被 slider 调用。

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()

关于ios - GPUImage - 尝试在混合过于频繁时过度释放帧缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27140906/

相关文章:

ios - 以编程方式将 iPhone 联系人导出到 .vcf 文件

c# - iOS 视频录制时长更新 UI

ios - KeyboardAvoidingView 在 IOS 上无法按预期工作

javascript - Trigger.IO Facebook 授权不打开登录页面

ios - 模拟器和设备给出不同的结果

ios - 如何优化 UIViewController 很长的导航堆栈的内存

swift - 如何根据字符在 Swift 中修剪字符串

ios - 使用 Swift 的 Socketscan 软扫描示例

ios - 使用 GPUImage 查找棋盘角点

ios - GPUImage - 点按时的聚焦和曝光无法正常工作 - 遗漏了什么?