Frage

Ich schreibe eine iPhone-Anwendung in Objective-C, die einige benutzerdefinierte Zeichnung in Ansichten verwendet, und ich würde auf Benchmark verschiedene Revisionen meines Codes gerne sehen, was wirklich hilft. Ich war die Planung dieses auf dem Handeln durch eine neue Anwendung einrichten, meinen benutzerdefinierten Zeichencode zum drawRect Zugabe: Methode der Ansicht, dann, in einem for-Schleife im View-Controller, [UIView setNeedsDisplay] eine große Anzahl von Zeiten und Zeit sandte, wie es lange in Anspruch nimmt. Doch die setNeedsDisplay Anrufe scheinen zwischengespeichert werden, so auch wenn ich es 1000-mal in einem Call-for-Schleife, wird die drawRect: Methode nur einmal aufgerufen. Auch habe ich versucht, drawRect Aufruf:. Direkt, aber ich brauche einen Grafikkontext eine Zeichnung zu tun, und wenn ich nicht setNeedsDisplay: verwenden UIGraphicsGetCurrentContext () nicht geben Sie mir einen Kontext

Irgendwelche Vorschläge?

Danke,

Kyle

War es hilfreich?

Lösung

Sie können Benchmark eine Ansicht, indem Sie wie folgt vor:

- (NSTimeInterval)timeTakenToDrawView:(UIView *)view count:(NSInteger)count
{
    CGRect bounds = [view bounds];
    NSDate *startDate = [NSDate date];
    UIGraphicsBeginImageContext(bounds.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    NSInteger i = 0;
    for (i = 0; i < count; i++) {
        CGContextSaveGState(context);
        [view drawRect:bounds];
        CGContextRestoreGState(context);
    }
    UIGraphicsEndImageContext();
    return [[NSDate date] timeIntervalSinceDate:startDate];
}

(Haben Sie versucht es nicht, aber es sollte funktionieren)

Andere Tipps

Innerhalb Ihres NSView der .m. Offensichtlich möchten Sie vielleicht dies zu einer UI oder etwas bis haken.

- (void)awakeFromNib {
    // Have to wait for the window to be onscreen, graphics context ready, etc
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFired:) userInfo:NULL repeats:NO];
}


- (void)timerFired:(NSTimer *)aTimer {
    [self lockFocus];

    NSDate* then = [NSDate date];

    int callIdx = 0;
    for( callIdx = 0; callIdx < 1000; callIdx++ ) {
        [self drawRect:[self bounds]];
    }
    NSDate* now = [NSDate date];

    [self unlockFocus];

    NSLog(@"Took %f seconds", [now timeIntervalSinceDate:then]);
}

- (void)drawRect:(NSRect)rect {
    [[NSColor redColor] set];
    NSRectFill(rect);
}

Vergessen Sie nicht, dass Sie auch das Coreimage Performance-Tool verwenden können, und bekommen Bildwiederholraten, wenn Ihr drawRect häufig verwendet wird.

Sie auch einige der Performance-Tool nutzen könnten, um zu sehen, wie lange in diesem Verfahren aufgewendet wird.

Wenn Sie nach etwas suchen, das etwas tiefer gehende Analyse geben kann, ich habe eine Reihe von Makros, die Sie für die Zeit hier Profilierungs verwenden können: https://gist.github.com/952456

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top