何时何地在长过滤器链中使用prepareForImageCapture

时间:2014-01-09 19:59:10

标签: ios cocoa-touch opengl-es ios7 gpuimage

我有几个过滤器 - 全部堆叠 - 用于处理图像,我使用滑块修改这些过滤器的设置。我遇到了一些内存限制,我正在考虑使用prepareForImageCapture来改善内存和性能,但我想知道在何时何地应用它?这完全适用于iOS 7。

  1. GPUImagePicture
  2. 创建UIImage
  3. 创建GPUImageFilter并将GPUImagePicture中的目标添加到GPUImageFilter
  4. 再创建X GPUImageFilters,通过addTarget:
  5. 将它们全部链接起来
  6. 创建GPUImageView并定位最后GPUImageFilter
  7. 处理GPUImagePicture
  8. 我应该在哪里拨打prepareForImageCapture?我应该在每个GPUImageFilter上调用它吗?如果是,何时以何种顺序调用它?

1 个答案:

答案 0 :(得分:2)

在过滤器上使用时,-prepareForImageCapture设置要通过纹理缓存访问的过滤器的渲染目标纹理。

这意味着当您在过滤器上调用此内容时,下次使用-imageFromCurrentlyProcessedOutput或其中一种照片捕获方法时,从该过滤器返回的UIImage将在其中包含内存映射表示过滤器的内部纹理。这减少了该时间点所需内存的一半,因为内存中只存在一个图像字节副本,而不是UIImage和过滤器后备纹理的单独副本。

但是,因为内存映射现在在UIImage和GPUImageFilter之间共享,所以过滤器将锁定在它呈现的最后一个图像上,直到解除分配提取的UIImage。如果为新图像重新渲染过滤器,结果将覆盖UIImage中的字节。这就是默认情况下所有过滤器都没有启用的原因,因为人们可能会对此行为感到困惑。

对于您在屏幕上显示的示例,您无需为任何这些过滤器设置此项。它仅影响从中提取静止图像的滤镜。更好的方法是在链中的第一个过滤器上使用-forceProcessingAtSize:,并使用目标视图的尺寸(以像素为单位)作为要强制的尺寸。渲染在最终视图中看不到的额外像素是没有意义的,这将节省内部表示此图像所需的内存。但是,在将最终处理的图像捕获到磁盘之前,请将大小强制为0,0,以便将这些过滤器恢复为完整大小。

我正在为过滤器的链接进行长期改进,包括缓存用于过滤器的帧缓冲区,以便可以重用它们。这将允许您创建任意长的过滤器链,没有额外的内存损失。但是,当我有这个工作时,不能保证。