2013-03-13 66 views
4

我的代碼如下:PieChart其中有很多這樣的片。每個切片都繪製在它自己的CALayer中,並使用addSublayer:添加到自定義視圖圖層。如何提高CGContextDrawPath/drawInContext的速度:

問題是,我在用戶拖動手指時動態更新餅圖(他們可以通過拖動來編輯餅圖值)。它運作良好,但重新繪製這些餡餅「切片」時,會有非常明顯的滯後。我看過iOS分析工具,它顯示> 50%的時間在CGContextDrawPath(),因爲每次用戶移動一定的度數時,它必須重新繪製餅圖切片。

我的問題是,我能做些什麼來提高此代碼的速度?有什麼我失蹤?另外作爲一個附註,這段代碼在iPad 2上運行良好(可接受的fps級別),但在iPad 3上它運行起來可怕,根據我的估計,它會慢兩倍。任何人都可以解釋嗎?它只是視網膜顯示器嗎?

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

回答

1

繪製圖形到iPad 3視網膜顯示比繪製到iPad 2非視網膜要慢。

我記得蘋果最初聲稱iPad 3是「比iPad 2快4倍的圖形」。這似乎並非如此。如果它是渲染視網膜(這是更多的像素4倍)到屏幕應該是至少相同的速度作爲非視網膜iPad 2.

蘋果發佈iPhone 4時發生同樣的問題iPhone 4實際上比3GS和3G都慢。

CoreGraphics slower on iPhone4 than on 3G/3GS

爲了提高FPS,你需要減少的drawRect需要借鑑到的像素數。我建議繪製你的CoreGraphics相關的東西半分辨率上下文。然後將該上下文作爲位圖並將其擴展至全分辨率。但只有在用戶拖動時。

+0

這麼認爲...這是一個巨大的恥辱。有什麼我做錯了,你可以看到嗎?或者我可以做什麼來讓事情變得更快? – 2013-03-13 16:38:43