2013-03-13 91 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