iOS - 减少GPUImage RAM的使用

时间:2016-05-03 10:55:10

标签: ios objective-c gpuimage

我正在使用GPUImage创建一个过滤器。图像显示正常。我还有一个UISlider,用户可以滑动以将alpha更改为过滤器。

以下是我设置过滤器的方法:

-(void)setupFirstFilter
{
    imageWithOpacity = [ImageWithAlpha imageByApplyingAlpha:0.43f image:scaledImage];
    pictureWithOpacity = [[GPUImagePicture alloc] initWithCGImage:[imageWithOpacity CGImage] smoothlyScaleOutput:YES];

    originalPicture = [[GPUImagePicture alloc] initWithCGImage:[scaledImage CGImage] smoothlyScaleOutput:YES];

    multiplyBlender = [[GPUImageMultiplyBlendFilter alloc] init];
    [originalPicture addTarget:multiplyBlender];
    [pictureWithOpacity addTarget:multiplyBlender];

    UIImage *pinkImage = [ImageFromColor imageFromColor:[UIColor colorWithRed:255.0f/255.0f green:185.0f/255.0f blue:200.0f/255.0f alpha:0.21f]];
    pinkPicture = [[GPUImagePicture alloc] initWithCGImage:[pinkImage CGImage] smoothlyScaleOutput:YES];

    overlayBlender = [[GPUImageOverlayBlendFilter alloc] init];
    [multiplyBlender addTarget:overlayBlender];
    [pinkPicture addTarget:overlayBlender];

    UIImage *blueImage = [ImageFromColor imageFromColor:[UIColor colorWithRed:185.0f/255.0f green:227.0f/255.0f blue:255.0f/255.0f alpha:0.21f]];
    bluePicture = [[GPUImagePicture alloc] initWithCGImage:[blueImage CGImage] smoothlyScaleOutput:YES];

    secondOverlayBlend = [[GPUImageOverlayBlendFilter alloc] init];
    [overlayBlender addTarget:secondOverlayBlend];
    [bluePicture addTarget:secondOverlayBlend];

    [secondOverlayBlend addTarget:self.editImageView];

    [originalPicture processImage];
    [pictureWithOpacity processImage];
    [pinkPicture processImage];
    [bluePicture processImage];
}

当滑块改变时,会调用它:

-(void)sliderChanged:(id)sender
{
    UISlider *slider = (UISlider*)sender;
    double value = slider.value;

    [originalPicture addTarget:multiplyBlender];
    [pictureWithOpacity addTarget:multiplyBlender];

    UIImage *pinkImage = [ImageFromColor imageFromColor:[UIColor colorWithRed:255.0f/255.0f green:185.0f/255.0f blue:200.0f/255.0f alpha:value]];
    pinkPicture = [[GPUImagePicture alloc] initWithCGImage:[pinkImage CGImage] smoothlyScaleOutput:NO];

    [multiplyBlender addTarget:overlayBlender];
    [pinkPicture addTarget:overlayBlender];

    [overlayBlender addTarget:secondOverlayBlend];
    [bluePicture addTarget:secondOverlayBlend];

    [secondOverlayBlend addTarget:self.editImageView];

    [originalPicture processImage];
    [pictureWithOpacity processImage];
    [pinkPicture processImage];
    [bluePicture processImage];
}

上面的代码运行正常。但幻灯片很慢,这需要170 MB或RAM。在按下使用过滤器之前,它大约是30 MB RAM。如何通过这个过滤器来减少RAM?

我已经缩小了图像尺寸。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我的第一个建议是摆脱单色UIImages及其相应的GPUImagePicture实例。相反,使用GPUImageSolidColorGenerator,它完全在GPU上执行此纯色生成。使其输出较小的图像尺寸,并按比例放大以适合较大的图像。这将节省您的UIImages所需的内存,并避免昂贵的绘制/上传过程。

但是,最终,我建议您制作自己的自定义过滤器,而不是使用多个输入图像运行多个混合步骤。您正在做的就是对源图像应用颜色修改,这可以在单个自定义过滤器中完成。

您可以将颜色传递给应用两个mix()操作的着色器,每种颜色一个。每个混合值的强度将对应于您在上面针对每种纯色使用的alpha。这会将其减少到一个输入图像和一个处理步骤,而不是三个输入图像和两个步骤。它会更快并且使用更少的内存。