4

以下のコードがあります。基本的には、これらのスライスが多数ある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);
}
4

1 に答える 1

1

iPad 3 Retinaディスプレイへのグラフィックの描画は、iPad2非Retinaへの描画よりも遅くなります。

私はAppleが当初iPad3は「iPad2より4倍速いグラフィックス」であると主張したことを思い出します。そうではないようです。その場合、Retina(4倍のピクセル数)を画面にレンダリングする場合は、少なくとも非RetinaiPad2と同じ速度にする必要があります。

AppleがiPhone4をリリースしたときにも同じ問題が発生しました。iPhone4は実際には3GSと3Gの両方よりも低速でした。

CoreGraphicsは3G/3GSよりもiPhone4の方が遅い

fpsを上げるには、drawRectが描画する必要のあるピクセル数を減らす必要があります。CoreGraphics関連のものを半分の解像度のコンテキストで描画することをお勧めします。次に、そのコンテキストをビットマップとして取得し、フル解像度にスケールアップします。ただし、ユーザーがドラッグしている間のみです。

于 2013-03-13T16:13:23.723 に答える