如何提高堆叠式 GPUImage 过滤器的性能

How to improve performance of stacked GPUImage Filters

正在开发一个使用一些 GPUImage 过滤器的小应用程序。玩了一段时间后,我发现如果我堆叠太多这些过滤器,我 运行 会遇到性能问题。

所以现在我有两个问题:

1.:如何正确堆叠过滤器?

我目前使用它的方式是遍历我的 GPUImageFilters 并让每个产生一个输出,然后使用该输出作为下一个过滤器的输入。

我发现有 FilterGroups 并尝试使用它们,但它们不再正确计算我的输出图像,并且还产生了一些无法始终重现的崩溃。

那么去这里的路是什么?我想我会浪费很多时间从 UIImage 转换为 GPUImage 内部使用的任何东西?关于如何改进它有什么想法吗?

2.:有没有办法在后台完成?

我读到 GPUImage 不是线程保存?!?但是你会如何f.e。用比方说 100 个滤镜过滤一张图像并将它们显示在 UICollectionView?任何更改以在线程外执行此操作?目前我正在主线程中进行处理,在每个图像过滤过程中只等待一小段时间给 UI 一些空闲时间...

有什么改进方法吗?

干杯, 乔治

如果您要在每个步骤中往返于 UIImages,那么您将以最慢的方式执行此操作。从 UIImage 中提取图像并将它们转换回 UIImage 的开销很大,因为您要通过 Core Graphics 往返并往返于 CPU.

相反,如果您想对单个图像执行多项操作,则需要使用 -addTarget: 链接您的过滤器。将过滤器添加为另一个过滤器的目标将导致其输出从一个阶段馈送到下一个阶段。这避免了你现在正在做的非常昂贵的 UIImage-and-back。

在最后阶段,如果您要在屏幕上显示,我会将您的最后一个目标定向到 GPUImageView。否则,您可以从最后阶段提取 UIImage。

GPUImage 目前无法在 iOS 后台进程中使用,因为它需要 OpenGL ES 访问。但是,该限制在 iOS 8 中放宽了,因此现在可以执行此操作。还没有花时间检查这个。

如果您想使用多个过滤器对一张图像进行过滤,您可以将一张图像输入同时定位到多个过滤器。处理该图像后,所有过滤器都将发挥作用。 GPU 是该进程的限制部分,我已经使用了多线程内部调度队列,因此您无需担心 运行 一个多线程。