GPUImage性能

0 core-image ios 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];


}
Run Code Online (Sandbox Code Playgroud)

Bra*_*son 5

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

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