2010-07-09 5 views
4

J'ai besoin de dessiner quelques centaines de lignes et de cercles sur ma vue et ils continuent à passer par une fonction de minuterie, où j'appelle [myView setNeedsDisplay] pour mettre à jour la vue.Mauvaise performance de CGContextStrokePath en dessinant quelques lignes et cercles sur l'iPhone

I sous-classe (myView) de UIView et mettent en place la fonction drawRect pour effectuer les opérations suivantes ...

-(void) drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGFloat red[4] = { 1, 0, 0, 1}; 

    CGContextSetLineWidth(context, 1); 
    CGContextSetShouldAntialias(context, NO); 
    CGContextSetLineCap(context, kCGLineCapSquare); 
    CGContextSetStrokeColor(context, red); 

    // rects is an array of CGRect of size ~200 
    for (int i = 0; i < N; i++) { 
     CGContextAddEllipseInRect(context, rects[i]); 
    } 
    // points is an array of CGPoint of size ~100 
    CGContextAddLines(context, points, N); 

    CGContextStrokePath(context, color); 
} 

Mais c'est chien lent. Y a-t-il quelque chose qui me manque ici? La réalisation d'un dessin complet prend presque 1 seconde

Répondre

7

L'animation d'objets en les redessinant constamment est une mauvaise façon de procéder. Le dessin au quartz est l'une des choses les plus lentes que vous puissiez faire, en raison du fonctionnement du système d'affichage. Au lieu de cela, ce que vous voulez faire est de créer des calques individuels ou des vues pour chaque élément qui sera animé. Ces calques ou vues ne seront dessinés qu'une seule fois, puis mis en cache. Lorsque les calques se déplacent, ils ne sont pas redessinés, ils sont simplement composés. De cette façon, même les appareils iOS les plus lents (l'iPhone original, l'iPhone 3G et l'iPod touch de première génération) peuvent animer jusqu'à 100 couches à 60 images par seconde.

Pensez-y comme l'animation d'un dessin animé. Plutôt que de demander aux animateurs de redessiner à la main chaque partie de chaque image, ils utilisent des cellules pour réutiliser les éléments entre les images qui restent les mêmes ou simplement se déplacer sans changer de forme. Cela réduit considérablement l'effort de produire un dessin animé.

+0

Merci Brad pour votre réponse rapide. Cependant, mon problème ici est qu'à chaque itération, mon algorithme peut retourner des formes géométriques aléatoires, il est donc difficile de les pré-dessiner et de les déplacer ensuite. Je suis sûr qu'il y aura encore moyen de faire cela. Mais pour l'instant j'ai trouvé une solution de contournement, dessinez tous mes trucs dans un tampon mémoire brut et convertissez-le jusqu'à UIImage, et affichez-le. Cela semble beaucoup plus rapide. – Abix

+0

@Abix: Je ne considère pas que ce soit une solution de contournement, mais la solution actuelle. Brad ne suggère pas seulement un moyen de résoudre le problème, mais explique que Quartz seul est le mauvais outil pour votre travail. –

Questions connexes