使用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)
}
}
答案 0 :(得分:2)
方法useNextFrameForImageCapture
应该应用于过滤,但不应用于图片。
blendFilter = GPUImageAlphaBlendFilter()
blendFilter.useNextFrameForImageCapture()
答案 1 :(得分:0)
我不确定这是否会对您有所帮助,但我也看到了这个问题并将此代码添加到主循环并修复了它。引用计数似乎存在问题。
GPUImageFramebuffer* fb = self.filter.framebufferForOutput;
[fb disableReferenceCounting];