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

时间:2015-02-16 07:32:09

标签: ios multithreading image-processing uiimage gpuimage

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

所以现在我有两个问题:

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

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

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

那么去这里的方式是什么?我想我的方式是浪费大量时间从UIImage转换为GPUImage在内部使用的内容?关于如何改进的任何想法?

2。:有没有办法在后台进行?

我读到GPUImage不是线程保存?!?但你怎么会这样。过滤一个图像,让我们说100个过滤器,并在UICollectionView中显示它们?关闭线程的任何改变吗?目前我正在主线程中进行处理,只是在每个图像过滤过程中等待很短的时间,为UI提供一些空闲时间...

如何改进呢?

干杯, 乔治

1 个答案:

答案 0 :(得分:4)

如果您在每一步都往返于UIImages,那么您可以通过最慢的方式进行此操作。从UIImage中提取图像并将其转换回来时,会有巨大的开销,因为您正在通过Core Graphics进行往返并进出CPU。

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

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

由于需要OpenGL ES访问,GPUImage目前无法在iOS后台进程中使用。但是,这个限制在iOS 8中变得更加明显,所以现在可以这样做。 Haven没有花时间检查这个。

如果要使用多个滤镜过滤一个图像,可以拍摄一个图像并同时将其定位到多个滤镜。处理完该图像后,所有过滤器都会尽可能地运行。 GPU是该过程的限制部分,我已经使用了多线程内部调度队列,因此您不必担心运行那一个多线程。