2016-05-03 16 views
0

Ich erstelle einen Filter mit GPUImage. Das Bild wird gut angezeigt. Ich habe auch einen UISlider, den der Benutzer schieben kann, um Alpha zum Filter zu ändern.iOS - Reduce GPUImage RAM-Auslastung

Hier ist, wie ich mein Setup-Filter:

-(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]; 
} 

Und wenn der Schieber geändert wird diese aufgerufen wird:

-(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]; 
} 

Der obige Code funktioniert gut. Aber die Folie ist langsam und das dauert bis zu 170 MB oder RAM. Vor dem Drücken, um Filter zu verwenden, sind es etwa 30 MB RAM. Wie kann ich den RAM durch diesen Filter reduzieren?

Ich verkleinern bereits die Bildgröße.

Jede Hilfe wird sehr geschätzt.

Antwort

2

Mein erster Vorschlag ist, die einfarbigen UIImages und ihre entsprechenden GPUImagePicture-Instanzen loszuwerden. Verwenden Sie stattdessen einen GPUImageSolidColorGenerator, der diese einfarbige Generierung vollständig auf der GPU ausführt. Lassen Sie es eine kleine Bildgröße ausgeben, die auf Ihr größeres Bild skaliert wird. Das spart den Speicher, der für Ihre UIImagages benötigt wird, und vermeidet einen kostspieligen Draw/Upload-Prozess.

Letztendlich würde ich jedoch empfehlen, einen eigenen Filter zu erstellen, anstatt mehrere Mischschritte mit mehreren Eingangsbildern auszuführen. Alles, was Sie tun, ist eine Farbänderung an Ihrem Quellbild, die innerhalb eines einzelnen benutzerdefinierten Filters durchgeführt werden kann.

Sie könnten Ihre Farben an einen Shader übergeben, der zwei mix() Operationen anwendet, einen für jede Farbe. Die Stärke jedes Mischwerts entspricht dem Alpha, das Sie oben für jede Volltonfarbe verwenden. Dies würde dies auf ein Eingabebild und einen Verarbeitungsschritt anstatt auf drei Eingabebilder und zwei Schritte reduzieren. Es wäre schneller und würde deutlich weniger Speicher verbrauchen.

+0

Hallo Brad. Danke für deine Antwort. Ich habe OpenGLES noch nie gemacht und ich weiß nicht, wo ich anfangen soll. Die obigen Filter, die ich verwendet habe, stammen alle aus Photoshop-Filtern, die ich gemacht habe. Könntest du mich bitte zu einem Tutorial oder einer Webseite führen, die über die Verwendung von OpenGL-Shadern unterrichtet? – imstillalive

+0

@imstillalive - Ehrlich gesagt, empfehle ich, die 100+ Shader zu betrachten, die im Framework gebündelt sind. Es gibt einige Beispiele für alle Arten von Farbmanipulationen, und Sie können eine davon nehmen und an Ihre Bedürfnisse anpassen. Es gibt mehrere, die zum Beispiel Farbton und Farbton anpassen. –