[英]How to improve speed of CGContextDrawPath / drawInContext:
我在下面有下面的代碼,它基本上是PieChart的一個切片,其中包含許多切片。 每個切片都在其自己的CALayer
繪制,並使用addSublayer:
添加到自定義視圖層addSublayer:
。
問題是我正在動態更新餅圖,因為用戶拖動他們的手指(他們可以通過拖動來編輯餅圖值)。 它運作良好,但重新繪制這些餡餅'切片'時會有明顯的延遲。 我看一下iOS Profiling工具,它顯示> 50%的時間在CGContextDrawPath()
因為每次用戶移動一定數量的度數時它必須重繪餅圖切片。
我的問題是,我該怎么做才能提高這段代碼的速度? 有什么我想念的嗎?
另外作為旁注,這個代碼在iPad 2(可接受的fps級別)上運行良好,但在iPad 3上它運行得很糟糕,從我的估計它慢了2倍。 有誰能解釋一下? 它只是視網膜顯示器嗎?
-(void)drawInContext:(CGContextRef)ctx {
// Create the path
CGRect insetBounds = CGRectInset(self.bounds, self.strokeWidth, self.strokeWidth);
CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
CGFloat radius = MIN(insetBounds.size.width/2, insetBounds.size.height/2);
CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, center.x, center.y);
CGPoint p1 = CGPointMake(center.x + radius * cosf(self.startAngle), center.y + radius * sinf(self.startAngle));
CGContextAddLineToPoint(ctx, p1.x, p1.y);
int clockwise = self.startAngle > self.endAngle;
CGContextAddArc(ctx, center.x, center.y, radius, self.startAngle, self.endAngle, clockwise);
CGContextClosePath(ctx);
// Color it
CGContextSetFillColorWithColor(ctx, self.fillColor.CGColor);
CGContextSetStrokeColorWithColor(ctx, self.strokeColor.CGColor);
CGContextSetLineWidth(ctx, self.strokeWidth);
CGContextDrawPath(ctx, kCGPathFillStroke);
}
將圖形繪制到iPad 3 Retina顯示屏比繪制到iPad 2非Retina更慢。
我記得Apple最初聲稱iPad 3“比iPad 2快了4倍”。 似乎並非如此。 如果它然后渲染Retina(它是4倍像素)到屏幕應該至少與非視網膜iPad 2相同的速度。
Apple發布iPhone 4時也出現了同樣的問題.iPhone 4實際上比3GS和3G都要慢。
iPhone4上的CoreGraphics比3G / 3GS慢
要增加fps,您需要減少drawRect需要繪制的像素數。 我建議將你的CoreGraphics相關內容繪制為半分辨率上下文。 然后將該上下文作為位圖並將其擴展到完整分辨率。 但只有在用戶拖動時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.