Кэширование в CGLayer медленнее, чем перерисовка на iPhone
-
14-09-2020 - |
Вопрос
Я работаю над простой программой рисования для iPhone.На данный момент события касания добавляют свое местоположение в список, который связан с группой вызовов CGContextAddLineToPoint, которые перерисовываются при каждом вызове drawRect.
У меня возникают проблемы с производительностью при довольно небольшом количестве строк (хотя они прозрачны), поэтому я попытался нарисовать все в CGLayer.Теперь вместо рисования каждой линии в каждом кадре каждая линия рисуется только один раз, а CGLayer выводится на экран в каждом кадре.
CGContextRef backgroundContext = CGLayerGetContext(pathBuffer);
CGContextSetLineWidth(backgroundContext, 2.0);
CGContextSetLineCap(backgroundContext, kCGLineCapButt);
CGContextSetStrokeColorWithColor(backgroundContext, [pathColor CGColor]);
if([[touchPoints objectAtIndex:0] continuesToNextPoint])
{
CGContextMoveToPoint(backgroundContext, [[touchPoints objectAtIndex:0] point].x, [[touchPoints objectAtIndex:0] point].y);
CGContextAddLineToPoint(backgroundContext, [[touchPoints objectAtIndex:1] point].x, [[touchPoints objectAtIndex:1] point].y);
CGContextStrokePath(backgroundContext);
}
//remove it from touchpoints
[touchPoints removeObjectAtIndex:0];
}
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawLayerAtPoint(context, CGPointMake(0, 0), pathBuffer);
Во всяком случае, это МЕДЛЕННЕЕ, чем то, что я делал раньше.Я делаю что-то неправильно?Будет ли мне лучше нарисовать UIImage или что-то в этом роде?Спасибо.
Решение
Что вам следует сделать, это вставить CALayer
в одно из ваших представлений, обновляя слой, а затем вызывая setNeedsDisplayInRect:
с границами области, которая изменилась на слое, что приводит к ее обновлению.Если вы попытаетесь обновить весь экран, это будет медленно.
Используете ли вы инструменты, чтобы определить, какие части медленные?Я рекомендую использовать его, чтобы узнать, какие части вас замедляют.