gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:28 25 4
gpt4 key购买 nike

我有几个过滤器——全部堆叠在一起——来处理图像,我使用 slider 来修改这些过滤器的设置。我遇到了一些内存限制,正在考虑使用 prepareForImageCapture 来提高内存和性能,但想知道在哪里/何时应用它?这仅适用于 iOS 7。

  1. UIImage 创建一个 GPUImagePicture
  2. 创建一个 GPUImageFilter 并将 GPUImagePicture 中的目标添加到 GPUImageFilter
  3. 再创建 X 个 GPUImageFilters,通过 addTarget: 将它们全部链接起来
  4. 创建一个 GPUImageView 并以最后一个 GPUImageFilter 为目标
  5. 处理GPUImagePicture

我应该在哪里调用 prepareForImageCapture?我应该在每个 GPUImageFilter 上调用它吗?如果是,何时以什么顺序调用它?

最佳答案

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

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

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

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

我正在对过滤器链进行长期改进,涉及缓存用于过滤器的帧缓冲区,以便它们可以重复使用。这将使您可以创建任意长的过滤器链,而不会造成额外的内存损失。不过,我无法保证什么时候可以正常工作。

关于ios - 在长过滤器链中何时何地使用 prepareForImageCapture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21029941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com