我在下面有以下代码,它基本上是PieChart的一个切片,其中包含许多切片。每个切片都是以自己的方式绘制的,CALayer
并使用addSublayer:
.
问题是我在用户拖动手指时动态更新饼图(他们可以通过拖动来编辑饼图值)。它运行良好,但在重新绘制这些饼图“切片”时存在非常明显的滞后。我查看了 iOS 分析工具,它显示 > 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);
}