3

画面に触れたときにビューを描画する、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が最初の呼び出しで非常に遅いのはなぜですか?そしてもっと重要なことに、どうすればこれを修正できますか?

4

1 に答える 1

3

rectを確認してください。最初の3つはフルスクリーンアップデートだと思います。私は以前にこの問題に遭遇しました。IOSは、何をしても(おそらくGLバッファリングシステムの場合)、最初の数回をフルスクリーンとして強制的に更新します。約5秒間そのままにしてから、もう一度何かを描くと、同じ動作になります。私は実際の原因が何であるかを理解していませんでした、そして私はこれまでにそうなるとは思えません:(。

私が最初に尋ねた質問を参照してください: UIGraphicsGetCurrentContext()短い寿命

于 2012-09-20T03:20:27.460 に答える