Кажется, что ни одно из этих решений не устраняет отставание, связанное с отображением изображений на экран (будь то из .png или с использованием CG).Оказание сотен «блочных» изображений -vs- Частично рендеринг «карты» блоков
Существует 28x16 сетка блоков, каждая из которых имеет 16x16 пикселей, а в некоторых точках игры около половины из них должны изменить свое изображение из-за изменения состояния. Наличие каждого блока в качестве подсмотра основного представления вызывает задержку, когда половина из них должна индивидуально изменять свое изображение (либо из .png, либо используя CG).
Я попробовал, имеющий один «карту» вид с которого DrawRect: метод:
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));
}
}
}
Так что мое решение было назвать setNeedsDisplayInRect: на карте, передавая кадр (16х16 Rect) блока которого состояние изменено. Я использую setNeedsDisplayInRect: неправильно, или это просто неэффективный способ сделать это?
Оба варианта (одно подзапрос и сотни подзаголовков) немного отстают от игры, когда большая часть платы заполнена другим изображением, а второе решение, в частности, задерживается всякий раз, когда требуется обновить изображение блока.
Любые идеи? Спасибо за помощь!
Что такое «грязный прямоугольник»? Я не понимаю первый абзац вашего ответа :( –
http://developer.apple.com/mac/library/documentation/cocoa/conceptual/CocoaViewsGuide/Optimizing/Optimizing.html понял это! Спасибо за указание меня в правильном направлении, вытянутый! –