シングルビューアプリでは、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
を呼び出すメソッドを呼び出すためにを使用しているので、プロパティを使用して1フレーム、5フレーム、または20フレームごとに呼び出されます。[self.view setNeedsDisplay]
drawRect
frameInterval
iPad2では、CGLayerが数百の6x6ポイントの長方形で埋められたときに描画する時間は、NSLogステートメントで出力されるように、約0.011〜0.012秒です。これは60fpsが可能です。(60fpsはフレームあたり0.01666秒です)
行を次のように変更した場合:
self.layer1 = CGLayerCreateWithContext(NULL, self.bounds.size, NULL);
(NULL
の代わりに使用context
)。その場合、時間は約0.014秒ですが、これは60fpsでも十分です。
しかし、新しいiPadでは、逆のことが起こっています。context
その回線で使用された場合、時間はなんと0.17秒になります...これは、6fpsでも適切ではありません。を使用する場合NULL
、時間は0.038であり、60 fpsには適していませんが、少なくとも20 fpsには適していますが、それでも許容範囲です。なぜそれがこのように動作しているのか、そしてそれをiPad、iPad 2、そして新しいiPadのすべてのプラットフォームでうまく機能させる方法やより良く機能させる方法を知っている人はいますか?
で呼び出すCGLayerCreateWithContext
とNULL
GPUキャッシュグラフィックコンテキストが与えられ、で呼び出すとビットマップコンテキストが与えられる場合、iPad 2で呼び出すとcontext
実際に高速になるのはなぜですか?CGLayerCreateWithContext
context
(私は新しいiPadでiOS 5.1.1を使用しており、iPad2でiOS5.1を使用しています...それほど違いはないはずです...そしてiPad2をアップグレードして別のiPadを使用できるようにしたくありません私のアプリに対してテストするための異なるiOSバージョンのデバイス)。