Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何提高堆叠GPUImage过滤器的性能_Ios_Multithreading_Image Processing_Uiimage_Gpuimage - Fatal编程技术网

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

Ios 如何提高堆叠GPUImage过滤器的性能,ios,multithreading,image-processing,uiimage,gpuimage,Ios,Multithreading,Image Processing,Uiimage,Gpuimage,“我正在开发一个使用一些GPUImage过滤器的小应用程序。在玩了一段时间后,我发现如果我堆叠了太多的过滤器,我会遇到性能问题 现在我有两个问题: 1.如何正确堆叠过滤器 我目前使用它的方式是循环我的GPUImageFilters,让每个过滤器产生一个输出,然后使用该输出作为下一个过滤器的输入 我发现有FilterGroups,我尝试使用它们,但它们不再正确地计算我的输出图像,并且还产生了一些无法始终再现的崩溃 那么到这里怎么走?我想我的方式会浪费很多时间从UIImage转换到GPUImage内

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

现在我有两个问题:

1.如何正确堆叠过滤器

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

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

那么到这里怎么走?我想我的方式会浪费很多时间从
UIImage
转换到
GPUImage
内部使用的任何东西?有什么办法可以改进吗

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

我读到
GPUImage
不是线程保存吗?!?但是,您将如何使用100个过滤器过滤一幅图像,并将其显示在
UICollectionView
中?有什么改变吗?目前我正在主线程中进行处理,在每个图像过滤过程中只需等待一小段时间,以便给UI一些空闲时间

有什么办法可以改进吗

干杯,
Georg

如果您在每一步都要往返于UIImages,那么您将以尽可能最慢的方式执行此操作。从UIImage中提取图像并将其转换回UIImage会带来巨大的开销,因为您要通过核心图形往返CPU

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

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

GPUImage当前无法用于iOS后台进程,因为它需要OpenGL ES访问。然而,这一限制在iOS 8中有所减轻,因此现在就有可能做到这一点。我还没有花时间来检查这个


如果要使用多个过滤器过滤一个图像,可以将一个图像输入并将其同时指向多个过滤器。在处理该图像后,所有过滤器将尽可能地工作。GPU是该过程的限制部分,我已经使用了一个多线程内部调度队列,因此您不必担心在多线程中运行该队列。

如果您在每一步都要往返于UIImages,您将以尽可能最慢的方式执行此操作。从UIImage中提取图像并将其转换回UIImage会带来巨大的开销,因为您要通过核心图形往返CPU

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

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

GPUImage当前无法用于iOS后台进程,因为它需要OpenGL ES访问。然而,这一限制在iOS 8中有所减轻,因此现在就有可能做到这一点。我还没有花时间来检查这个


如果要使用多个过滤器过滤一个图像,可以将一个图像输入并将其同时指向多个过滤器。在处理该图像后,所有过滤器将尽可能地工作。GPU是该过程的限制部分,我已经使用了一个多线程内部调度队列,因此您不必担心在多线程中运行该队列。

感谢您的帮助!!!因此,使用这个
-addTarget:
方法,我必须将我的过滤器放入
GPUImageFilterGroup
,对吗?只是我试过了,结果看起来和我的另一个慢方法不同。。。我组建团队的方式:在过滤器阵列上循环。将一个过滤器的目标设置为阵列中的下一个过滤器。将第一个设置为
初始过滤器
,将最后一个设置为
终端过滤器
。。。然后说
filterGroup.imageByFilteringImage(图像)
。。。这样对吗?@Georg-不,你不需要把他们分成一组。组只是将一系列操作视为单个操作的一种方便方式(例如,您可以轻松地将一个组与另一个组或筛选器交换)。您可以使用-addTarget:将一个过滤器链接到下一个过滤器,并从链接中的最后一个过滤器中提取最终图像。以这种方式链接的图像与通过在每个步骤手动创建UIImages处理的图像之间应该没有明显的区别。在UIImage转换中可能会出现颜色空间转换或预乘alpha变化。超级酷。。。我想起来了:)非常感谢你的GPUImage。。。真的很酷!!!谢谢你的帮助,布拉德!!!因此,使用这个
-addTarget:
方法,我必须将我的过滤器放入
GPUImageFilterGroup
,对吗?只是我试过了,结果看起来和我的另一个慢方法不同。。。我组建团队的方式:在过滤器阵列上循环。将一个过滤器的目标设置为阵列中的下一个过滤器。将第一个设置为
初始过滤器
,将最后一个设置为
终端过滤器
。。。然后说
filterGroup.imageByFilteringImage(图像)
。。。w是正确的吗