GPUImage - 过滤链顺序是否重要?

时间:2017-06-10 18:19:01

标签: ios objective-c gpuimage

我已经设置了一堆滑块来操纵GPUIImagePicture所针对的各种GPUIImageFilters的值。我目前的连锁订单如下:

self.gpuImagePicture = [[GPUImagePicture alloc] initWithImage:self.image];
[self.gpuImagePicture addTarget:self.toneCurveFilter];
[self.toneCurveFilter addTarget:self.exposureFilter];
[self.exposureFilter addTarget:self.constrastFilter];
[self.constrastFilter addTarget:self.saturationFilter];
[self.saturationFilter addTarget:self.highlightShadowFilter];
[self.highlightShadowFilter addTarget:self.whiteBalanceFilter];
[self.whiteBalanceFilter addTarget:self.gpuImageView];
[self.whiteBalanceFilter setInputRotation:[self gpuImageRotationModeForImage:self.image] atIndex:0];
[self.gpuImagePicture processImage];

当我移除色调曲线滤镜时,一切都很顺利。如果我单独使用色调曲线滤镜我也没有问题。当我使用上面的实现时,处理速度会大大减慢。

过滤器链的顺序在内存管理和处理方面是否重要,或者是否将色调曲线过滤器添加到链的其余部分只是将此设置推到边缘?

编辑:

我意识到可能值得一提的是滑块如何改变滤镜值。例如,如果移动了曝光滑块,则会触发此代码:

[self.exposureFilter setExposure:sender.value];
[self.gpuImagePicture processImage];

1 个答案:

答案 0 :(得分:0)

有时,过滤顺序并不重要,但它通常会起作用。某些颜色调整操作以这样的方式工作,即可以在不更改输出的情况下重新排列它们,但是如果重新排列它们,大多数滤波器计算将产生轻微到显着不同的结果。把它想象成算法,你改变操作顺序或移动一些括号。

现在,在性能或内存使用方面,订单通常并不重要。分支操作是唯一可以发挥作用的情况(具有针对多个输出的过滤器,在某些点上混合或组合成一个输出)。但是,你在这里没有。

上面你有很多步骤,你链接的每个过滤器都有开销。但是,我甚至惊讶于你看到性能上的差异,因为上面的瓶颈应该是创建GPUImagePicture。实例化其中一个远比你在其上执行的任何过滤器慢得多,因为需要重新渲染Core Graphics并将图片上传为纹理。

如果您正在重复使用toneCurveFilter或其他人,请确保在再次使用-addTarget之前它们与之前的所有目标完全断开连接。您可以将所有过滤器连接到之前的目标,同时切换图片,这意味着每张新图片都会不断添加目标。这将导致巨大的放缓。

我打赌像上面这样的东西会减慢你的速度,但是如果有疑问,可以启动Time Profiler和/或OpenGL分析器,看看你真正花费了所有时间。