UIGraphicsGetCurrentContext () kurze Lebensdauer

Ich habe eine Ansicht, die Freihandzeichnen implementiert, aber ich habe ein kleines Problem. Auf dem iPad 3 ist mir aufgefallen, dass alles zur Hölle gegangen ist, und ich habe versucht, meinen Zeichencode zu aktualisieren (wahrscheinlich, wie ich es eigentlich hätte tun sollen), um nur den Teil zu aktualisieren, der gestrichen wurde. Der erste Hub nach dem Öffnen und der erste Hub nach etwa 10 Sekunden Leerlauf sind jedoch extrem langsam. Nachdem alles "aufgewärmt" ist, ist es butterweich und benötigt nur noch ca. 0,15ms pro DrawRect. Ich weiß nicht warum, aber das gesamte Ansichtsrechteck wird für das erste drawRect und das erste drawRect nach dem Leerlauf als verschmutzt markiert (dann dauert die Aktualisierung etwa 150 ms). Die Stapelverfolgung zeigt, dass mein Rechteck von überschrieben wirdCABackingStoreUpdate_

Ich habe versucht, die Ebene nicht zu zeichnen, wenn das Rechteck riesig war, aber dann wird mein gesamter Kontext leer (wird wieder angezeigt, wenn ich wie ein Lottoschein über die alten Bereiche zeichne). Hat jemand eine Idee, was mit UIGraphicsGetCurrentContext () los ist? Das ist der einzige Ort, an dem ich mir das Problem vorstellen kann. Das heißt, mein Sichtkontext wurde vom Kontext-Genie zerrissen, sodass er sich selbst wieder vollständig rendern muss. Gibt es eine Einstellung, mit der ich denselben Kontext beibehalten kann? Oder ist hier noch etwas los ... Es ist nicht erforderlich, das gesamte Rechteck nach der ersten Anzeige zu aktualisieren.

Mein drawRect ist sehr einfach:

- (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);

}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage