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。这会将其减少到一个输入图像和一个处理步骤,而不是三个输入图像和两个步骤。它会更快并且使用更少的内存。
我正在使用 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。这会将其减少到一个输入图像和一个处理步骤,而不是三个输入图像和两个步骤。它会更快并且使用更少的内存。