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]会导致断言传递的频率更高。