5

Estoy escribiendo una aplicación de iPhone en Objective-C que utiliza algunos dibujos personalizados en las vistas y me gustaría comparar varias revisiones de mi código para ver lo que realmente ayuda. Estaba planeando hacer esto al configurar una nueva aplicación, agregando mi código de dibujo personalizado al método drawRect: de la vista, luego, en un ciclo for en el controlador de vista, enviando [UIView setNeedsDisplay] una gran cantidad de veces y cronometrando cuánto tiempo lleva a completar. Sin embargo, las llamadas setNeedsDisplay parecen estar en caché, por lo que aunque lo llamo 1000 veces en un ciclo for, el método drawRect: se llama solo una vez. Además, traté de llamar a drawRect: directamente, pero necesito un contexto de gráficos para hacer algunos dibujos y cuando no uso setNeedsDisplay: UIGraphicsGetCurrentContext() no me da un contexto.Punto de referencia UIView drawRect: método

¿Alguna sugerencia?

Gracias,

Kyle

Respuesta

5

Se pueden comparar una vista de la siguiente manera:

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

(no lo he probado, pero debería funcionar)

+0

Eso funciona perfectamente, gracias. – Kyle

0

Dentro de .m de su NSView. Obviamente, es posible que desee conectar esto a una interfaz de usuario o algo así.

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

lockFocus no parecen estar disponibles en UIViews, también, necesito alguna forma de obtener un contexto gráfico para dibujar en mi función drawRect: setNeedsDisplay proporciona uno a través de UIGraphicsGetCurrentContext() pero llamar a drawRect: directamente no parece hacer lo mismo. – Kyle

0

No se olvide que también puede usar el CoreImage herramienta de rendimiento y obtenga tasas de cuadros si su drawRect se usa con frecuencia.

También puede usar algunas de las herramientas de rendimiento para ver cuánto tiempo se usa en ese método.

0

Si usted está buscando algo que puede dar un poco más de análisis en profundidad, tengo un conjunto de macros que puede utilizar para el tiempo de perfilado aquí: https://gist.github.com/952456

Cuestiones relacionadas