正在处理使用一些GPUImage
过滤器的小应用。在玩了一段时间后,我发现如果我堆叠太多这些过滤器,我会遇到性能问题。
所以现在我有两个问题:
1。:如何正确堆叠过滤器?
我目前使用它的方式是遍历我的GPUImageFilters
并让每个产生一个输出,然后使用该输出作为下一个过滤器的输入。
我发现有FilterGroups
我尝试使用它们,但是他们不再正确计算我的输出图像,并且还产生了一些一直无法重现的崩溃。
那么去这里的方式是什么?我想我的方式是浪费大量时间从UIImage
转换为GPUImage
在内部使用的内容?关于如何改进的任何想法?
2。:有没有办法在后台进行?
我读到GPUImage
不是线程保存?!?但你怎么会这样。过滤一个图像,让我们说100个过滤器,并在UICollectionView
中显示它们?关闭线程的任何改变吗?目前我正在主线程中进行处理,只是在每个图像过滤过程中等待很短的时间,为UI提供一些空闲时间...
如何改进呢?
干杯, 乔治
答案 0 :(得分:4)
如果您在每一步都往返于UIImages,那么您可以通过最慢的方式进行此操作。从UIImage中提取图像并将其转换回来时,会有巨大的开销,因为您正在通过Core Graphics进行往返并进出CPU。
相反,如果您想对单个图片执行多项操作,则需要使用-addTarget:
对过滤器进行链接。添加过滤器作为另一个过滤器的目标将导致其输出在GPU上从一个阶段馈送到下一个阶段。这可以避免你现在正在做的非常昂贵的UIImage-and-back。
在最后阶段,如果您正在显示屏幕,我会将您的最后一个目标指向GPUImageView。否则,您可以从最后阶段提取UIImage。
由于需要OpenGL ES访问,GPUImage目前无法在iOS后台进程中使用。但是,这个限制在iOS 8中变得更加明显,所以现在可以这样做。 Haven没有花时间检查这个。
如果要使用多个滤镜过滤一个图像,可以拍摄一个图像并同时将其定位到多个滤镜。处理完该图像后,所有过滤器都会尽可能地运行。 GPU是该过程的限制部分,我已经使用了多线程内部调度队列,因此您不必担心运行那一个多线程。