为什么drawRect中的CGContextDrawImage最初变慢?

时间:2012-09-20 03:07:18

标签: iphone objective-c ios core-graphics drawrect

在支持ARC的iOS应用程序中考虑这个简单的UIView子类,该应用程序在触摸屏幕时绘制视图:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    CGPoint location = [[touches anyObject] locationInView:self];

    int padding = brushSize / 2;

    CGRect brushRect = CGRectMake(
        location.x - padding, location.y - padding,
        brushSize, brushSize
    );

    [self setNeedsDisplayInRect:brushRect];

}

- (void)drawRect:(CGRect)rect {

    NSDate *start = [NSDate date];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, rect, brushImage);

    NSLog(@"%f", [start timeIntervalSinceNow]);

}

在此示例中,brushImage是方形位图,brushSize是一个描述位图宽度和高度的int。

我一直得到这样的日志输出:

-0.131658
-0.133998
-0.143314
-0.007132
-0.006968
-0.007444
-0.006733
-0.008574
-0.007163
-0.006560
-0.006958

对drawRect的第一次调用比后续调用需要更长的时间才能完成,之后drawRect会一直保持快速。只有在视图初始化后的第一次调用中,drawRect才会很慢。

我在模拟器和我尝试的所有物理设备上都看到了类似的结果。初始调用总是需要更长时间才能完成。

为什么drawRect / CGContextDrawImage在初始调用时这么慢?更重要的是,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

检查矩形。我打赌前三个是全屏更新。我以前遇到过这个问题。无论你做什么,IOS都会强行更新前几次全屏(可能是它的GL缓冲系统)。如果你不管它大约5秒钟,然后再画一些东西你会得到相同的行为。我从来没有弄清楚实际原因是什么,我怀疑我会不会:(。

请参阅我最初提出的问题:UIGraphicsGetCurrentContext() short lifetime