0

在 Single View App 中,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);

我正在使用 aCADisplayLink来调用[self.view setNeedsDisplay]在视图控制器中调用的方法,以便使用该属性drawRect每 1 帧、5 帧或 20 帧调用一次。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 的所有平台上运行良好或更好地运行?

如果调用CGLayerCreateWithContextwithNULL给出了 GPU 缓存的图形上下文,调用 withcontext给出了位图上下文,那么为什么在 iPad 2 上调用CGLayerCreateWithContextwith实际上更快context

(我在新 iPad 上使用 iOS 5.1.1,在 iPad 2 上使用 iOS 5.1 ......这应该没有太大区别......而且我不想升级 iPad 2 以便我可以拥有另一个具有不同 iOS 版本的设备来测试我的应用程序)。

4

0 回答 0