Ios 在长筛选链中何时何地使用PrepareFormageCapture
我有几个过滤器——都是堆叠的——来处理图像,我使用滑块来修改这些过滤器的设置。我遇到了一些内存限制,正在考虑使用Ios 在长筛选链中何时何地使用PrepareFormageCapture,ios,cocoa-touch,opengl-es,ios7,gpuimage,Ios,Cocoa Touch,Opengl Es,Ios7,Gpuimage,我有几个过滤器——都是堆叠的——来处理图像,我使用滑块来修改这些过滤器的设置。我遇到了一些内存限制,正在考虑使用prepareForImageCapture来提高内存和性能,但我想知道在哪里/何时应用它?这严格适用于iOS 7 从UIImage 创建GPUImageFilter并将目标从GPUImagePicture添加到GPUImageFilter 创建X个以上的GPUImageFilters,通过addTarget: 创建一个GPUImageView并将最后一个GPUImageFilter指
prepareForImageCapture
来提高内存和性能,但我想知道在哪里/何时应用它?这严格适用于iOS 7
UIImage
GPUImageFilter
并将目标从GPUImagePicture
添加到GPUImageFilter
GPUImageFilters
,通过addTarget:
GPUImageView
并将最后一个GPUImageFilter
指向它GPUImagePicture
我应该在哪里调用
prepareForImageCapture
?我是否应该在每个GPUImageFilter
上调用它,如果是,何时以及以什么顺序调用它?当在过滤器上使用时,-prepareForImageCapture
设置要通过纹理缓存访问的过滤器的渲染目标纹理
这意味着,当您在过滤器上调用此函数时,下次使用-imageFromCurrentlyProcessedOutput
或其中一种照片捕获方法时,从该过滤器返回的UIImage将包含过滤器内部纹理的内存映射表示。这会将该时间点所需的内存减少一半,因为内存中只存在图像字节的一个副本,而不是UIImage和过滤器背景纹理的单独副本
但是,由于内存映射现在在UIImage和GPUImageFilter之间共享,因此该过滤器在其渲染的最后一个图像处被锁定,直到释放提取的UIImage为止。如果为新图像重新呈现过滤器,结果将覆盖UIImage中的字节。这就是为什么默认情况下不会为所有过滤器启用此选项的原因,因为人们可能会对此行为感到困惑
对于要在屏幕上显示的示例,不需要为任何过滤器设置此选项。它只影响从中提取静止图像的过滤器。更好的方法是在链中的第一个过滤器上使用-forceProcessingAtSize:
,并使用目标视图的尺寸(以像素为单位)作为强制执行的大小。渲染最终视图中看不到的额外像素是没有意义的,这将节省在内部表示此图像所需的内存。不过,在将最终处理的图像捕获到磁盘之前,请将大小强制为0,0,以将这些过滤器恢复为其完整大小
我正在对过滤器的链接进行长期改进,包括缓存用于过滤器的帧缓冲区,以便它们可以重用。这将允许您创建任意长的过滤器链,而无需额外的内存损失。但是,我不能保证什么时候能让它工作。很惊讶,如果我直接向GUI图像视图显示,它不会有任何改进。我只是一时兴起,每当我更新链中的任何过滤器时,就在每个过滤器上调用
prepareForImageCapture
(因为在同一个过滤器上多次调用它并没有什么坏处),这大大改善了我的内存问题,而没有明显的缺点。我将尝试使用forceProcessingAtSize
代替prepareForImageCapture
,看看会发生什么。@Shizam-GPUImageView只会从上一个过程中获取纹理并将其重新渲染到屏幕上。将过滤器的纹理附加到iOS纹理缓存不会减少内存中纹理的大小,只会使GPU纹理和CPU端内存之间直接映射成为可能。完全没有理由通过切换链中的过滤器以使用iOS纹理缓存来查看内存性能的任何差异。可能是正常的内存压力计算隐藏了内存。在内存监视器中查找其他进程中的奇数内存增益。