2016-05-03 45 views
0

我正在用GPUImage创建一个过滤器。图像显示正常。我还有一个UISlider,用户可以滑动以更改过滤器的alpha值。iOS - 减少GPUImage RAM使用

下面是如何设置我的过滤器:滑块

-(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。如何通过执行此过滤器来减少内存?

我已经缩小了图像的大小。

任何帮助,非常感谢。

回答

2

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

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

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

+0

嗨布拉德。谢谢你的回答。我从来没有做过openGLES,我不知道从哪里开始。我使用的上述滤镜全部来自我制作的Photoshop滤镜。您能否请我指导一个教程或网站,教导如何使用OpenGL着色器。 – imstillalive

+0

@imstillalive - 老实说,我建议看一下框架中捆绑的100多个着色器。有很多种颜色处理的例子,你可以选择其中的一种,并根据你的需要调整它。例如,有几个可以调整色调和色调。 –