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
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
@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. –