在单视图应用程序中,FooView是主视图。在FooView的drawRect
中,如果我这样做
if (!self.layer1) {
CGContextRef context = UIGraphicsGetCurrentContext();
NSLog(@"current context is drawRect is %@", context);
self.layer1 = CGLayerCreateWithContext(context, self.bounds.size, NULL);
NSLog(@"layer1 is %@", self.layer1);
self.context1 = CGLayerGetContext(self.layer1);
CGContextSetFillColorWithColor(self.context1, [[UIColor orangeColor] CGColor]);
}
CGContextRef context = UIGraphicsGetCurrentContext();
NSDate *start = [NSDate date];
CGContextDrawLayerAtPoint(context, CGPointZero, self.layer1);
NSTimeInterval timeInterval = -[start timeIntervalSinceNow];
NSLog(@"It took %f to draw", timeInterval);
我正在使用CADisplayLink
来调用在视图控制器中调用[self.view setNeedsDisplay]
的方法,以便每1帧,5帧或20帧调用drawRect
,使用frameInterval
属性。
在iPad2上,当CGLayer充满数百个6x6点矩形时,绘制的时间约为0.011到0.012秒,由NSLog语句打印。这能够达到60fps。 (每帧60fps为0.01666秒)
如果我将该行更改为:
self.layer1 = CGLayerCreateWithContext(NULL, self.bounds.size, NULL);
(使用NULL
代替context
)。然后时间大约是0.014秒,这对于60 fps来说仍然是好的。
但是在新iPad上,情况正好相反:如果在该线上使用context
,则时间高达0.17秒......即使是6 fps也不行。如果使用NULL
,则时间为0.038,这对于60 fps不好,但至少对于20 fps是好的,这仍然是可接受的。有没有人知道它为什么会这样,以及如何使它在iPad,iPad 2和新iPad的所有平台上都运行良好或更好地工作?
如果使用CGLayerCreateWithContext
调用NULL
给出了GPU缓存的图形上下文,并且使用context
调用给出了位图上下文,那么为什么在iPad 2上,如果调用{{ 1}}与CGLayerCreateWithContext
?
(我在新iPad上使用iOS 5.1.1,在iPad 2上使用iOS 5.1 ......这应该不会有太大差别......我不想升级iPad 2以便我可以让另一台具有不同iOS版本的设备来测试我的应用程序。)