以下のコードがあります。基本的には、これらのスライスが多数あるPieChartの 1 つのスライスです。各スライスは独自に描画され、CALayer
を使用してカスタム ビュー レイヤーに追加されますaddSublayer:
。
問題は、ユーザーが指をドラッグすると円グラフが動的に更新されることです (ドラッグして円グラフの値を編集できます)。うまく機能しますが、これらのパイの「スライス」を再描画するときに非常に顕著な遅延があります。iOS プロファイリング ツールを調べたところCGContextDrawPath()
、ユーザーが特定の角度だけ移動するたびに円グラフのスライスを再描画する必要があるため、50% 以上の時間であることがわかりました。
私の質問は、このコードの速度を改善するにはどうすればよいですか? 足りないものはありますか?
また、補足として、このコードは iPad 2 (許容レベルの fps) ではうまく動作しますが、iPad 3 では非常に遅く、私の推定では 2 倍遅くなります。誰でもこれを説明できますか?Retinaディスプレイだけですか?
-(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);
}