【问题标题】:GPUImage performanceGPU图像性能
【发布时间】:2014-06-06 08:33:48
【问题描述】:

我正在使用 GPUImage 对图像应用过滤器和链式过滤器。我正在使用 UISlider 更改过滤器的值,并随着滑块值的变化在图像上连续应用过滤器。这样用户在更改值时就可以看到输出是什么。

这会导致处理速度非常慢,有时 UI 挂起或事件应用程序在收到内存不足警告时崩溃。

如何使用 GPUImage 实现快速过滤器实现。我似乎有一些在旅途中应用过滤器的应用程序,它们的 UI 甚至都没有挂起。

谢谢,

这是我用作滑块值更改的示例代码。

- (IBAction) foregroundSliderValueChanged:(id)sender{


    float value = ([(UISlider *)sender maximumValue] - [(UISlider *)sender value]) + [(UISlider *)sender minimumValue];

    [(GPUImageVignetteFilter *)self.filter setVignetteEnd:value];

    GPUImagePicture *filteredImage = [[GPUImagePicture alloc]initWithImage:_image];
    [filteredImage addTarget:self.filter];
    [filteredImage processImage];
    self.imageView.image  = [self.filter imageFromCurrentlyProcessedOutputWithOrientation:_image.imageOrientation];


}

【问题讨论】:

    标签: ios gpuimage core-image


    【解决方案1】:

    您尚未指定如何设置过滤器链、使用哪些过滤器或如何进行更新,因此除了最通用的建议外,很难提供所有建议。不过,还是这样:

    • 如果处理要在屏幕上显示的图像,切勿使用 UIImageView。转换为 UIImage 和从 UIImage 转换是一个非常缓慢的过程,并且永远不应该用于实时更新任何内容。相反,请转到 GPUImagePicture -> 过滤器 -> GPUImageView。这样可以将图像保留在 GPU 上,并且在处理和内存方面效率更高。
    • 只处理实际显示的像素数。在链中的第一个过滤器上使用 -forceProcessingAtSize: 或 -forceProcessingAtSizeRespectingAspectRatio: 以将其分辨率降低到 GPUImageView 的输出分辨率。这将导致您的过滤器对通常比全分辨率源图像小很多倍的图像帧进行操作。没有理由处理您永远看不到的像素。然后,当您需要最终将全分辨率图像捕获到磁盘时,您可以将 0 大小传递给这些相同的方法。
    • 寻找更有效的方法来设置您的过滤器链。如果您有一组通用的简单操作反复应用于图像,请考虑创建一个自定义着色器来组合这些操作(视情况而定)。昂贵的操作有时也有更便宜的替代品,例如我如何使用 GPUImageiOSBlur 的下采样然后上采样通道来使用比普通 GPUImageGaussianBlur 更小的模糊半径。

    【讨论】:

    • @user3714284 - 是的,所以你正在做我在项目符号 1 中警告的事情。不要使用 UIImageView。此外,不要在滑块的每一次移动上都创建一个新的 GPUImagePicture 实例。请参阅 SimpleImageFilter 示例应用程序,了解如何高效地实时更新图像过滤器预览。
    • 是的,我看到了过滤器展示示例,它的工作就像一个魅力,根本没有任何滞后,当我的实现时它是.. :) 这就是我寻求帮助的原因.感谢布拉德,让我们的生活更轻松 :)
    • @user3714284 - SimpleImageFilter 示例更接近您的情况,我在那里的静态图像上设置了实时过滤器预览。您可能可以基于此实现您的实现。
    猜你喜欢
    • 2012-07-09
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2011-02-22
    • 2012-07-05
    • 2011-08-20
    相关资源
    最近更新 更多