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
  • 创建X个以上的
    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纹理缓存来查看内存性能的任何差异。可能是正常的内存压力计算隐藏了内存。在内存监视器中查找其他进程中的奇数内存增益。