我有几个过滤器 - 全部堆叠 - 用于处理图像,我使用滑块修改这些过滤器的设置。我遇到了一些内存限制,我正在考虑使用prepareForImageCapture
来改善内存和性能,但我想知道在何时何地应用它?这完全适用于iOS 7。
GPUImagePicture
UIImage
GPUImageFilter
并将GPUImagePicture
中的目标添加到GPUImageFilter
GPUImageFilters
,通过addTarget:
GPUImageView
并定位最后GPUImageFilter
GPUImagePicture
我应该在哪里拨打prepareForImageCapture
?我应该在每个GPUImageFilter
上调用它吗?如果是,何时以何种顺序调用它?
答案 0 :(得分:2)
在过滤器上使用时,-prepareForImageCapture
设置要通过纹理缓存访问的过滤器的渲染目标纹理。
这意味着当您在过滤器上调用此内容时,下次使用-imageFromCurrentlyProcessedOutput
或其中一种照片捕获方法时,从该过滤器返回的UIImage将在其中包含内存映射表示过滤器的内部纹理。这减少了该时间点所需内存的一半,因为内存中只存在一个图像字节副本,而不是UIImage和过滤器后备纹理的单独副本。
但是,因为内存映射现在在UIImage和GPUImageFilter之间共享,所以过滤器将锁定在它呈现的最后一个图像上,直到解除分配提取的UIImage。如果为新图像重新渲染过滤器,结果将覆盖UIImage中的字节。这就是默认情况下所有过滤器都没有启用的原因,因为人们可能会对此行为感到困惑。
对于您在屏幕上显示的示例,您无需为任何这些过滤器设置此项。它仅影响从中提取静止图像的滤镜。更好的方法是在链中的第一个过滤器上使用-forceProcessingAtSize:
,并使用目标视图的尺寸(以像素为单位)作为要强制的尺寸。渲染在最终视图中看不到的额外像素是没有意义的,这将节省内部表示此图像所需的内存。但是,在将最终处理的图像捕获到磁盘之前,请将大小强制为0,0,以便将这些过滤器恢复为完整大小。
我正在为过滤器的链接进行长期改进,包括缓存用于过滤器的帧缓冲区,以便可以重用它们。这将允许您创建任意长的过滤器链,没有额外的内存损失。但是,当我有这个工作时,不能保证。