2012-04-05 6 views
1

Ich muss meine "drawRect" -Methode verbessern. Es ist so extrem langsam. Ich habe 10 transparente PNG's, die ich mit verschiedenen Mischmodi zusammenführen möchte. Ich habe einen Beitrag aus der Apple Developer Lib und Stackoverflow gelesen.Wie kann die drawRect-Leistung verbessert werden, um verschiedene UIImages zusammenzuführen?

Jetzt möchte ich wissen, wie ich meinen Code und die allgemeine Zeichenleistung verbessern kann. Könnten Sie mir bitte helfen? Das Laden all dieser Bilder innerhalb einer for-Schleife macht es so langsam, oder? Wie bekomme ich die meiste Leistung?

- (void)drawRect:(CGRect)rect { 

     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGAffineTransform matrix =CGContextGetCTM(context); 
     CGAffineTransformInvert(matrix); 
     CGContextConcatCTM(context,matrix); 

      CGRect contentRect; 

      // load each UIImage 
     for (i=0; i< [configurationArray count]; i = i + 1) { 
        image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:nil]]; 

    contentRect = CGRectMake(x,y,image.size.width,image.size.height); 
    CGContextSetBlendMode (context, kCGBlendModeScreen); 
    CGContextSetAlpha (context, [layerData.layerAlpha floatValue]); 


    CGContextDrawImage (context,contentRect, image.CGImage); 

    } 
} 

UPDATE:

Jetzt CALayers ı'm mit dem Pixel direkt auf die benötigte Position zu bringen. Aber ich brauche verschiedene Mischmodi, Alpha- und Farbfüllungen für jede Schicht. Gibt es eine Möglichkeit zu vermeiden, die teure Methode "CGContextDrawImage" auf jeder Ebene aufzurufen? ZB ich hoffe, es ist möglich, nur den Kontext für die geringe Größe der spezifischen Ebene zu aktualisieren, oder? Oder muss ich die gesamte UIView für jede Kontextänderung rendern?

Ich hoffe, dass jemand mich in die richtige Richtung schieben kann. Ich muss nur zu diesem Thema lernen. Danke für jede Hilfe.

- (void)drawRect:(CGRect)rect { 
// load each UIImage 
     for (int i=0; i< [myArray count]; i++) { 

     image = [[ImageCache sharedImageCache] imageForKey:imageName]; 

     CALayer* sublayer = [CALayer layer] ; 

     [sublayer setPosition:CGPointMake(image.size.width/2, image.size.height/2)]; 
     [sublayer setFrame:CGRectMake(x, y, image.size.width, image.size.height)]; 

     CGImageRef layerImage = [image CGImage]; 
     [sublayer setContents:(__bridge id) layerImage]; 
     [sublayer setBackgroundColor:[[UIColor clearColor] CGColor]]; 
     [self.layer addSublayer:sublayer]; 

// How can i set the blend mode, color fill & alpha value without 
// calling the expensive "CGContextDrawImage" ? Possible? 

} 
} 
+1

Sie sollten Ihre zehn Bilder wahrscheinlich nicht in '-drawRect:' laden. Laden und cachen Sie sie woanders zuerst. Seien Sie jedoch vorsichtig bei der Speichernutzung mit diesen vielen Bildern. –

+0

Danke Brad. Ich werde es testen. Vielen Dank. – geforce

+0

Es hat mir geholfen, bessere Frameraten zu bekommen, aber wegen der 1024x600px UIView hoffe ich, dass es mehr Möglichkeiten gibt, es zu verbessern. Was ist mit CALayers? Irgendwelche anderen Ideen, wie man mehr FPS erhält? – geforce

Antwort

0

Per Brad Kommentar:

Sie sollten wahrscheinlich die zehn Bilder in -drawRect nicht geladen werden :. Laden und cachen Sie sie woanders zuerst. Seien Sie jedoch vorsichtig bei der Speichernutzung mit diesen vielen Bildern.

Ich habe mit Brad Ansatz beendet.

Verwandte Themen