0

シングルビューアプリでは、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]drawRectframeInterval

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のすべてのプラットフォームでうまく機能させる方法やより良く機能させる方法を知っている人はいますか?

で呼び出すCGLayerCreateWithContextNULLGPUキャッシュグラフィックコンテキストが与えられ、で呼び出すとビットマップコンテキストが与えられる場合、iPad 2で呼び出すとcontext実際に高速になるのはなぜですか?CGLayerCreateWithContextcontext

(私は新しいiPadでiOS 5.1.1を使用しており、iPad2でiOS5.1を使用しています...それほど違いはないはずです...そしてiPad2をアップグレードして別のiPadを使用できるようにしたくありません私のアプリに対してテストするための異なるiOSバージョンのデバイス)。

4

0 に答える 0