6

我正在用 Objective-C 编写一个 iPhone 应用程序,它在视图中使用了一些自定义绘图,我想对我的代码的各种修订进行基准测试,看看有什么真正有帮助。我打算通过设置一个新的应用程序来做到这一点,将我的自定义绘图代码添加到视图的 drawRect: 方法中,然后,在视图控制器的 for 循环中,发送[UIView setNeedsDisplay]大量时间并计时需要多长时间去完成。然而,这些setNeedsDisplay调用似乎被缓存了,所以即使我在 for 循环中调用它 1000 次,该drawRect:方法也只被调用一次。另外,我尝试直接调用 drawRect: 但我需要一个图形上下文来进行一些绘图,并且当我不使用setNeedsDisplay:UIGraphicsGetCurrentContext() 时不会给我一个上下文。

有什么建议么?

谢谢,

凯尔

4

4 回答 4

5

您可以通过执行以下操作对视图进行基准测试:

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

(没试过,但应该可以)

于 2009-05-12T02:23:14.710 回答
0

在你的 NSView 的 .m 里面。显然,您可能希望将其连接到 UI 或其他东西。

- (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);
}
于 2009-05-12T01:07:48.453 回答
0

不要忘记,如果您的 drawRect 经常使用,您还可以使用 CoreImage 性能工具并获取帧速率。

您还可以使用一些性能工具来查看该方法花费了多长时间。

于 2009-05-12T03:20:21.357 回答
0

如果您正在寻找可以进行更深入分析的东西,我有一组宏可以用于时间分析:https ://gist.github.com/952456

于 2011-05-02T21:58:40.340 回答