两次后 GPUImageView 停止响应 "Filter Change"

GPUImageView stop responding to "Filter Change" after two times

我可能漏掉了什么。我正在尝试将过滤器更改为我的 GPUImageView。它实际上在前两次工作(有时只有一次),然后停止响应更改。我找不到从 GPUImageView.

中删除目标的方法

代码

for x in filterOperations
        {
            x.filter.removeAllTargets()
        }
        let f = filterOperations[randomIntInRange].filter
        let media = GPUImagePicture(image: self.largeImage)
        media?.addTarget(f as! GPUImageInput)
        f.addTarget(g_View)
        media.processImage()

有什么建议吗? * 正在处理来自我的库的静止图像

更新

更新代码

//Global

var g_View: GPUImageView!
var media = GPUImagePicture()

override func viewDidLoad() {
super.viewDidLoad()
    media = GPUImagePicture(image: largeImage)
}

func changeFilter(filterIndex : Int)
{
    media.removeAllTargets()
    let f = returnFilter(indexPath.row) //i.e GPUImageSepiaFilter()
    media.addTarget(f as! GPUImageInput)
    f.addTarget(g_View)

    //second Part
    f.useNextFrameForImageCapture()
    let sema = dispatch_semaphore_create(0)
    imageSource.processImageWithCompletionHandler({
    dispatch_semaphore_signal(sema)
        return
    })

     dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)
     let img =       f.imageFromCurrentFramebufferWithOrientation(img.imageOrientation)
     if img != nil
     {
     //Useable - update UI

     }
     else
     {
        //  Something Went wrong

     }

}

我的主要建议是不要在每次要更改滤镜或其应用于图像的选项时都创建新的 GPUImagePicture。这是一个昂贵的操作,因为它需要通过 Core Graphics 并将纹理上传到 GPU。

此外,由于您没有在上述代码之外维护对 GPUImagePicture 的引用,因此一旦您超出范围,它就会被释放。这会破坏渲染链并导致黑色图像甚至崩溃。 processImage() 是一个异步操作,因此在您退出上述范围时它可能仍在运行。

相反,为您的图像创建并维护对单个 GPUImagePicture 的引用,在其上更换滤镜(或更改现有滤镜的选项),并将结果定位到您的 GPUImageView。这会更快,消耗更少的内存,并且不会让您面临过早的释放。