Кэширование в CGLayer медленнее, чем перерисовка на iPhone
Я нахожусь в процессе создания простой программы для рисования для 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 или что-то? Благодарю.
1 ответ
Что вы должны делать, это вставить CALayer
в одном из ваших представлений, обновляя слой, а затем вызывая setNeedsDisplayInRect:
с границами области, которая изменилась на слое, что вызывает его обновление. Если вы попытаетесь обновить весь экран, это будет медленно.
Используете ли вы инструменты, чтобы выяснить, какие части медленные? Я рекомендую использовать его, чтобы узнать, какие части замедляют вас.