2012-04-05 3 views
1

J'ai besoin d'améliorer ma méthode "drawRect". C'est tellement lent. J'ai 10 pngs transparents que je veux fusionner avec différents modes de fusion. J'ai lu un article du Apple Developer Lib et de Stackoverflow.Comment améliorer la performance de drawRect pour fusionner différents UIImages ensemble?

Maintenant, je veux savoir comment améliorer mon code et les performances globales de dessin. Pourriez-vous s'il vous plaît me contacter? Le chargement de toutes ces images dans une boucle for le rend si lent, non? Comment obtenir le meilleur rendement?

- (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); 

    } 
} 

MISE À JOUR:

Maintenant, en utilisant CALayers pour Im mettre le pixel direct sur la position nécessaire. Mais j'ai besoin de différents modes de fusion, alpha et couleurs pour chaque couche. Y at-il un moyen d'éviter d'appeler la méthode coûteuse "CGContextDrawImage" sur chaque couche? E.g J'espère qu'il est possible de mettre à jour le contexte pour la petite taille de la couche spécifique, non? Ou ai-je besoin de rendre l'intégralité de UIView pour chaque changement de contexte?

J'espère que quelqu'un pourra me pousser dans la bonne direction. Je dois juste apprendre sur ce sujet. Merci pour toute aide.

- (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

Vous ne devriez probablement pas charger vos dix images dans '-drawRect:'. Chargez-les et mettez-les en cache quelque part d'abord. Faites attention à l'utilisation de la mémoire avec autant d'images, cependant. –

+0

Merci Brad. Je vais le tester. Merci. – geforce

+0

Cela m'a aidé à obtenir de meilleurs taux d'images, mais en raison de l'UIView 1024x600px, j'espère qu'il y a plus de façons de l'améliorer. Qu'en est-il de CALayers? D'autres idées comment obtenir plus de FPS? – geforce

Répondre

0

par le commentaire de Brad:

Vous ne devriez probablement pas charger vos dix images à l'intérieur -drawRect :. Chargez-les et mettez-les en cache quelque part d'abord. Faites attention à l'utilisation de la mémoire avec autant d'images, cependant.

J'ai terminé avec l'approche de Brad.

Questions connexes