Il semble qu'aucune de ces solutions n'élimine le retard associé au rendu des images sur l'écran (que ce soit à partir de .png ou en utilisant CG).Rendu de centaines d'images "bloc" -vs- Rendu partiel d'une "carte" de blocs
Il y a une grille de blocs de 16x16 pixels de 28x16, et à certains endroits du jeu, environ la moitié d'entre eux ont besoin de changer d'image à cause d'un changement d'état. Avoir chaque bloc comme une sous-vue de la vue principale provoque un retard lorsque la moitié d'entre eux ont besoin de changer individuellement leur image (soit à partir de .png ou en utilisant CG).
J'ai essayé d'avoir une « carte » vue avec dont drawRect: méthode est:
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, rect);
// width and height are defined as the width and height of the grid (28x16 for iPhone)
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
// states[] is an enum instance variable that holds the states of each block in the map (state determines image)
if (states[(x * height) + y] == PXBlockStateEmpty) {
CGContextSetFillColorWithColor(context, [UIColor colorWithRed:153.0/255.0 green:153.0/255.0 blue:153.0/255.0 alpha:0.5].CGColor);
CGContextSetStrokeColorWithColor(context, [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5].CGColor);
CGContextAddRect(context, CGRectMake(x * 16, y * 16, 16, 16));
CGContextDrawPath(context, kCGPathFillStroke);
} else if (states[(x * height) + y] == PXBlockStateSolid || states[(x * height) + y] == PXBlockStateSolidEdge) {
CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.0 green:0.0 blue:102.0/255.0 alpha:0.9].CGColor);
CGContextSetStrokeColorWithColor(context, [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5].CGColor);
CGContextAddRect(context, CGRectMake(x * 16, y * 16, 16, 16));
CGContextDrawPath(context, kCGPathFillStroke);
} else if (states[(x * height) + y] == PXBlockStateBuilding) {
CGContextSetFillColorWithColor(context, [UIColor colorWithRed:51.0/255.0 green:51.0/255.0 blue:51.0/255.0 alpha:0.5].CGColor);
CGContextFillRect(context, CGRectMake(x * 16, y * 16, 16, 16));
}
}
}
Donc ma solution était d'appeler setNeedsDisplayInRect: sur la carte, en passant le cadre (rect 16x16) du bloc dont état changé. Est-ce que j'utilise setNeedsDisplayInRect: incorrectement, ou est-ce juste un moyen inefficace de le faire? Les deux options (une sous-vue par rapport à des centaines de sous-vues) sont décalées lorsqu'un peu de la carte est remplie avec une image différente, et la seconde solution est particulièrement lente lorsque l'image de tout bloc doit être mise à jour.
Des idées? Merci de votre aide!
Qu'est-ce qu'un "rectangle sale"? Je ne comprends pas le premier paragraphe de votre réponse :( –
http://developer.apple.com/mac/library/documentation/cocoa/conceptual/CocoaViewsGuide/Optimizing/Optimizing.html trouvé pour vous! moi dans la bonne direction, drawonward! –