在iPad 2上与新iPad上的CGLayerCreateWithContext的奇怪行为?

时间:2012-05-31 09:18:42

标签: ios uiview core-graphics cglayer graphicscontext

在单视图应用程序中,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版本的设备来测试我的应用程序。)

0 个答案:

没有答案