5

Piszę aplikację na iPhone'a w Objective-C, która wykorzystuje niestandardowy rysunek w widokach i chciałbym przetestować różne wersje mojego kodu, aby zobaczyć, co naprawdę pomaga. Planowałem to zrobić, konfigurując nową aplikację, dodając mój niestandardowy kod rysunkowy do metody drawRect: view, następnie w pętli for w kontrolerze widoku, wysyłając [UIView setNeedsDisplay] kilka razy dużą liczbę razy i określając, jak długo to trwa. trwa do ukończenia. Jednak wywołania setNeedsDisplay wydają się być buforowane, więc mimo że nazywam to 1000 razy w pętli for, metoda drawRect: jest wywoływana tylko raz. Próbowałem również wywoływać drawRect: bezpośrednio, ale potrzebuję kontekstu graficznego do zrobienia rysunku i kiedy nie używam setNeedsDisplay: UIGraphicsGetCurrentContext() nie daje mi kontekstu.Benchmark UIView drawRect: method

Wszelkie sugestie?

Dzięki,

Kyle

Odpowiedz

5

Można odniesienia w widoku w następujący sposób:

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

(nie próbowałem, ale powinno działać)

+0

To działa idealnie, dzięki. – Kyle

0

Wewnątrz .m Twojego NSView jest. Oczywiście możesz podłączyć to do interfejsu użytkownika lub coś podobnego.

- (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 nie wydają się być dostępne na UIViews, również, potrzebuję jakiś sposób na uzyskanie kontekstu graficznego do narysowania w moim drawRect: function, setNeedsDisplay zapewnia jeden poprzez UIGraphicsGetCurrentContext(), ale wywołanie drawRect: bezpośrednio nie wydaje się robić to samo. – Kyle

0

Nie zapomnij można również użyć CoreImage narzędzie wydajności i uzyskaj liczbę klatek na sekundę, jeśli twój drawRect jest często używany.

Można również użyć niektórych narzędzi wydajności, aby sprawdzić, ile czasu zużyto w tej metodzie.

Powiązane problemy