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];

有时,筛选顺序无关紧要,但通常很重要。某些颜色调整操作的工作方式是,可以在不更改输出的情况下重新排列它们,但如果重新排列它们,大多数滤镜计算将产生略微不同的结果。把它想象成算术,你改变运算顺序或移动一些括号。

现在,当涉及到性能或内存使用时,顺序通常无关紧要。分支操作是这种情况发挥作用的唯一情况(具有针对多个输出的过滤器,在某些时候混合或组合成一个输出)。不过,你这里没有。

您在上述中确实有许多步骤,并且您链接的每个筛选器都有开销。但是,我很惊讶你甚至看到性能上的差异,因为上面的瓶颈应该是GPUImagePicture的创建。实例化其中一个比你对其执行的任何滤镜都要慢得多,因为需要通过核心图形重新渲染和上传图片作为纹理。

如果要重用 toneCurveFilter 或其他目标,请确保它们与之前的所有目标完全断开连接,然后再使用 -addTarget: 再次使用。您可能会切换图片,同时将所有滤镜连接到其以前的目标,这意味着每张新图片都会不断添加目标。这将导致巨大的减速。

我敢打赌,像上面这样的东西会减慢你的速度,但是当有疑问时,请启动时间分析器和/或OpenGL分析器,看看你真正把所有时间都花在哪里。

相关内容

  • 没有找到相关文章

最新更新