GPUImage性能

用户名

我正在使用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];


}
布拉德·拉森(Brad Larson)

您尚未指定如何设置过滤器链,使用的过滤器或更新方式,因此很难提供除最通用的建议以外的所有建议。不过,这里是:

  • 如果处理图像以显示在屏幕上,请不要使用UIImageView。往返于UIImage的转换是一个非常缓慢的过程,并且绝对不能用于任何内容的实时更新。相反,转到GPUImagePicture->过滤器-> GPUImageView。这样可以将图像保留在GPU上,并且在处理和内存方面都更加高效。
  • 仅处理与实际显示一样多的像素。在链中的第一个过滤器上使用-forceProcessingAtSize:-forceProcessingAtSizeRespectingAspectRatio:将其分辨率降低到GPUImageView的输出分辨率。这将使您的滤镜在通常比全分辨率源图像小很多倍的图像帧上运行。没有理由处理您永远不会看到的像素。然后,当您最终需要将全分辨率图像捕获到磁盘时,可以将0大小传递给这些相同的方法。
  • 找到更有效的方法来设置您的过滤器链。如果您有一遍又一遍地应用于图像的通用简单操作集,请考虑根据需要创建一个结合了这些操作的自定义着色器。昂贵的操作有时也有更便宜的替代品,例如我如何对GPUImageiOSBlur使用向下采样然后向上采样的过程,以使用比普通GPUImageGaussianBlur小得多的模糊半径。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章