UIGraphicsGetCurrentContext () короткое время жизни
У меня есть представление, которое реализует рисование от руки, но у меня есть небольшая проблема. Я заметил на iPad 3, что все пошло к черту, поэтому я попытался обновить свой код рисования (вероятно, как я должен был сделать в первую очередь), чтобы обновить только ту часть, которая была поглажена. Тем не менее, первый ход после открытия и первый ход после примерно 10 секунд простоя являются чрезвычайно медленными. После того, как все "подогревается" он гладкий, как масло, и занимает всего около 0,15 мс на один оборот. Я не знаю почему, но весь прямоугольник вида помечается как грязный для первого drawRect и первого drawRect после простоя (тогда для обновления требуется около 150 мс). Трассировка стека показывает, что мой прямоугольник переопределяетсяCABackingStoreUpdate_
Я пытался не рисовать слой, если прямоугольник был огромным, но тогда весь мой контекст стал пустым (появится снова, когда я нарисую старые области, как лотерейный билет). Кто-нибудь есть какие-либо идеи, что происходит с UIGraphicsGetCurrentContext ()? Это единственное место, где я могу себе представить, в чем проблема. То есть контекст моего представления был вырван контекстным джином, поэтому он должен снова полностью отрисоваться. Могу ли я использовать какой-либо параметр для сохранения того же контекста? Или здесь происходит что-то еще ... нет необходимости обновлять полный прямоугольник после первоначального отображения.
Мой drawRect очень прост:
- (void)drawRect:(CGRect)rect
{
CGContextRef c = mDrawingLayer ? CGLayerGetContext(mDrawingLayer) : NULL;
if(!mDrawingLayer)
{
c = UIGraphicsGetCurrentContext();
mDrawingLayer = CGLayerCreateWithContext(c, self.bounds.size, NULL);
c = CGLayerGetContext(mDrawingLayer);
CGContextSetAllowsAntialiasing(c, true);
CGContextSetShouldAntialias(c, true);
CGContextSetLineCap(c, kCGLineCapRound);
CGContextSetLineJoin(c, kCGLineJoinRound);
}
if(mClearFlag)
{
CGContextClearRect(c, self.bounds);
mClearFlag = NO;
}
CGContextStrokePath(c);
CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();
CGContextDrawLayerInRect(UIGraphicsGetCurrentContext(), self.bounds, mDrawingLayer);
NSLog(@"%.2fms : %f x %f", (CFAbsoluteTimeGetCurrent() - startTime)*1000.f, rect.size.width, rect.size.height);
}