簡體   English   中英

- (void)drawRect:(CGRect)rect; 正在耗盡幾乎所有的iPhone CPU

[英]-(void) drawRect:(CGRect)rect; is using up nearly all of iPhone CPU

- (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]];
}

clippingRegiontextRegionUIBezierPaths ,為我提供了我想要的圓角矩形(首先是剪裁區域,第二個是我文本的疊加)

中間部分繪制了3個圖像並讓它們滾動,我每次刷新CADisplayLink都會更新,並通過調用[self setNeedsDisplay]使繪圖區域無效,並且還增加了我的imageScroll變量。


現在該背景信息已經完成,這是我的問題:

它運行,甚至運行順利。 但它占用了絕對高的CPU時間(80%+)!! 如何將其關閉到手機上的GPU? 有人告訴我關於CALayers但我以前從未處理過他們

將繪圖的每個組件繪制成某個(視圖或圖層)並讓它保持緩存繪圖。 然后你只需移動或轉換每個組件,就像你說的那樣,它都是由GPU完成的。

您可以使用單個視圖或單個圖層執行此操作,但這並不重要(視圖一個層,在引擎蓋下)。 關鍵在於,當您真正想要的是移動相同的持久碎片時,不需要從頭開始不斷地重繪。

了解CALayer將是一個好主意,因為它實際上是iOS上所有繪圖的基礎。 有什么比這更重要的了解?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM