如何有效地级联 CIFilter

How to efficiently cascade CIFilters

目前我正在像这样级联 CIFilters:

    let filterA = CIFilter(...)
    let filterB = CIFilter(...)
    let filterC = CIFilter(...)

    var outputImage = CIImage(data: myInputData, options: [.applyOrientationProperty : true])

    filterA.setValue(outputImage, forKey: kCIInputImageKey)
    var outputImage = filterA.outputImage

    filterB.setValue(outputImage, forKey: kCIInputImageKey)
    var outputImage = filterB.outputImage

    filterC.setValue(outputImage, forKey: kCIInputImageKey)
    var outputImage = filterC.outputImage

    return render(ouputImage)

使用一个 var outputImage 是否在某种程度上效率低下?或者一般来说,什么是级联 CIFilters 的最高效的性能方式?

基本上就可以了。是否使用这些额外的变量并不重要,因为 Core Image 只会在图像渲染后计算效果。

就我个人而言,我不建议为每张图片重复使用相同的变量,这可能会混淆在哪里使用哪个图片。相反,我会直接从每个过滤器传递 属性:

filterA.setvalue(inputImage, forKey: kCIInputImageKey)
filterB.setValue(filterA.outputImage, forKey: kCIInputImageKey)
filterC.setValue(filterB.outputImage, forKey: kCIInputImageKey)

return render(filterC.outputImage)

性能完全一样。