簡體   English   中英

如何提高CGContextDrawPath / drawInContext的速度:

[英]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.

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