2010-05-19 2 views
0

Кажется, что ни одно из этих решений не устраняет отставание, связанное с отображением изображений на экран (будь то из .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: неправильно, или это просто неэффективный способ сделать это?

Оба варианта (одно подзапрос и сотни подзаголовков) немного отстают от игры, когда большая часть платы заполнена другим изображением, а второе решение, в частности, задерживается всякий раз, когда требуется обновить изображение блока.

Любые идеи? Спасибо за помощь!

ответ

1

Вызов setNeedsDisplayInRect: влияет на аргумент drawRect: но в остальном такой же, как setneedsDisplay. Прямоугольник drawRect: принимает объединение всех грязных прямоугольников. Если вы только рисуете контент, который пересекает этот прямоугольник, оставляя нетронутый контент, вы можете увидеть улучшение скорости. Судя по фрагменту кода выше, вы каждый раз рисуете каждую плитку. Так как это объединение, вы можете также отслеживать грязные плитки отдельно и рисовать грязные плитки. В этом случае вызовите CGContextClearRect для отдельных фрагментов, а не для очистки всего контекста, если только они не загрязнены.

CGContextAddRect добавляет прямоугольник к пути, который будет нарисован. Поскольку вы рисуете путь в каждом цикле, не создавая новый путь, вы перерисовываете области по мере продвижения цикла. Вероятно, быстрее использовать CGContextFillRect и CGContextStrokeRect вместо пути.

Создание каждой плитки отдельного UIView несет больше накладных расходов, чем чертеж в целом. Вы должны быть в состоянии получить более высокую скорость от этого метода после того, как изломы будут разработаны.

+0

Что такое «грязный прямоугольник»? Я не понимаю первый абзац вашего ответа :( –

+0

http://developer.apple.com/mac/library/documentation/cocoa/conceptual/CocoaViewsGuide/Optimizing/Optimizing.html понял это! Спасибо за указание меня в правильном направлении, вытянутый! –