1
- (void)drawRect:(CGRect)rect{

    float sliceSize = rect.size.width / imagesShownAtOnce;
    //Apply our clipping region and fill it with black
    [clippingRegion addClip];
    [clippingRegion fill];

    //Draw the 3 images (+1 for inbetween), with our scroll amount.
    CGPoint loc;
    for (int i=0;i<imagesShownAtOnce+1;i++){
        loc = CGPointMake(rect.origin.x+(i*sliceSize)-imageScroll, rect.origin.y);
        [[buttonImages objectAtIndex:i] drawAtPoint:loc];
    }

    //Draw the text region background
    [[UIColor blackColor] setFill];
    [textRegion fillWithBlendMode:kCGBlendModeNormal alpha:0.4f];

     //Draw the actual text.
    CGRect textRectangle = CGRectMake(rect.origin.x+16,rect.origin.y+rect.size.height*4/5.6,rect.size.width/1.5,rect.size.height/3);
    [[UIColor whiteColor] setFill];
    [buttonText drawInRect:textRectangle withFont:[UIFont fontWithName:@"Avenir-HeavyOblique" size:22]];
}

clippingRegionそして、私textRegionUIBezierPaths望む丸みを帯びた長方形を私に与えることです(最初はクリッピング領域用、2番目はテキストのオーバーレイとして)

中央のセクションでは、3 つの画像を描画し、それらをスクロールさせます。これは、 から 2 回更新するたびに更新され、CADisplayLinkを呼び出して描画領域を無効にし、[self setNeedsDisplay]さらに imageScroll 変数を増やします。


背景情報が完了したので、ここに私の問題があります:

それは実行され、さらにスムーズに実行されます。しかし、絶対に大量の CPU 時間を消費しています (80% 以上)!! 代わりにこれを電話の GPU にプッシュするにはどうすればよいですか? 誰かが CALayers について教えてくれましたが、私はそれらを扱ったことはありません。

4

1 に答える 1

4

図面の各コンポーネントを一度何か (ビューまたはレイヤー) に描画し、キャッシュされた図面を保持します。次に、各コンポーネントを移動または変換するだけで、まさにあなたが言うように、すべて GPU によって行われます。

個々のビューまたは個々のレイヤーでこれを行うことができますが、それは実際には問題ではありません (ビューボンネットの下のレイヤーです)。要点は、同じ永続的なピースを移動するだけで本当に必要な場合は、常にゼロから再描画する必要がないということです。

CALayer について学ぶことは良い考えです。それは実際、iOS でのすべての描画の基礎となっているからです。それよりも知っておくべき重要なことは何でしょうか?

于 2012-09-27T05:10:20.273 に答える