Question

Je suis en train d'écrire une application iPhone en Objective-C qui utilise un certain dessin personnalisé dans les vues et je voudrais évaluer différents révisions de mon code pour voir ce qui aide vraiment. Je planantes faire en mettant en place une nouvelle application, en ajoutant mon code de dessin personnalisé à la méthode drawRect: de la vue, puis, dans une boucle dans le contrôleur de vue, l'envoi [UIView setNeedsDisplay] un certain nombre de fois et chronométrant le temps qu'il faut pour terminer. Cependant, les appels semblent setNeedsDisplay être mis en cache si bien que je l'appelle 1000 fois dans une boucle, la méthode est appelée drawRect: une seule fois. Aussi, j'ai essayé d'appeler drawRect. Directement, mais je besoin d'un contexte graphique pour faire des dessins et quand je ne l'utilise UIGraphicsGetCurrentContext setNeedsDisplay: () ne me donne pas un contexte

Toutes les suggestions?

Merci,

Kyle

Était-ce utile?

La solution

Vous pouvez référence une vue en procédant comme suit:

- (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];
}

(N'a pas essayé, mais il devrait fonctionner)

Autres conseils

A l'intérieur du .m de votre NSView. Il est évident que vous pouvez brancher jusqu'à présent à une interface utilisateur ou quelque chose.

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

Ne pas oublier que vous pouvez également utiliser l'outil de performance CoreImage et obtenir un framerate si votre drawRect est souvent utilisé.

Vous pouvez également utiliser certains outils de performance pour voir combien de temps est consacré à cette méthode.

Si vous cherchez quelque chose qui peut donner une analyse un peu plus en profondeur, j'ai un ensemble de macros que vous pouvez utiliser pour le temps de profilage ici: https://gist.github.com/952456

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top