画面に触れたときにビューを描画する、ARC対応のiOSアプリのこの単純なUIViewサブクラスについて考えてみます。
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
CGPoint location = [[touches anyObject] locationInView:self];
int padding = brushSize / 2;
CGRect brushRect = CGRectMake(
location.x - padding, location.y - padding,
brushSize, brushSize
);
[self setNeedsDisplayInRect:brushRect];
}
- (void)drawRect:(CGRect)rect {
NSDate *start = [NSDate date];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, rect, brushImage);
NSLog(@"%f", [start timeIntervalSinceNow]);
}
この例でbrushImage
は、は正方形のビットマップでありbrushSize
、ビットマップの幅と高さを表す整数です。
私は一貫して次のようなログ出力を取得します:
-0.131658
-0.133998
-0.143314
-0.007132
-0.006968
-0.007444
-0.006733
-0.008574
-0.007163
-0.006560
-0.006958
drawRectの最初の呼び出しは、後続の呼び出しよりも完了するのにはるかに長い時間がかかり、drawRectはその後も一貫して高速です。drawRectが遅いのは、ビューが初期化された後の最初の呼び出しでのみです。
シミュレーターと私が試したすべての物理デバイスの両方で同様の結果が見られます。最初の呼び出しは、完了するまでに常にはるかに長い時間がかかります。
drawRect / CGContextDrawImageが最初の呼び出しで非常に遅いのはなぜですか?そしてもっと重要なことに、どうすればこれを修正できますか?