iOS - 减少 GPUImage RAM 使用

iOS - Reduce GPUImage RAM usage

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

我已经缩小了图片尺寸。

非常感谢任何帮助。

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

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

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