[英]-(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]];
}
clippingRegion
和textRegion
是UIBezierPaths
,為我提供了我想要的圓角矩形(首先是剪裁區域,第二個是我文本的疊加)
中間部分繪制了3個圖像並讓它們滾動,我每次刷新CADisplayLink
都會更新,並通過調用[self setNeedsDisplay]
使繪圖區域無效,並且還增加了我的imageScroll變量。
現在該背景信息已經完成,這是我的問題:
它運行,甚至運行順利。 但它占用了絕對高的CPU時間(80%+)!! 如何將其關閉到手機上的GPU? 有人告訴我關於CALayers但我以前從未處理過他們
將繪圖的每個組件繪制成某個(視圖或圖層)並讓它保持緩存繪圖。 然后你只需移動或轉換每個組件,就像你說的那樣,它都是由GPU完成的。
您可以使用單個視圖或單個圖層執行此操作,但這並不重要(視圖是一個層,在引擎蓋下)。 關鍵在於,當您真正想要的是移動相同的持久碎片時,不需要從頭開始不斷地重繪。
了解CALayer將是一個好主意,因為它實際上是iOS上所有繪圖的基礎。 有什么比這更重要的了解?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.