2

UIBezierPath に多くの (10000+) 行を追加するループがあります。これで問題ないように見えますが、ベジェパスをレンダリングしようとすると、デバイスが非常に遅くなり、ぎくしゃくします。これは、パスに追加した行が多すぎるためですか?

UIBezierPath への行の追加 - 簡略化: (これで問題ないようです)

[path moveToPoint:CGPointZero];

   for (int i = 0; i < 10000; i++ ) {      
           [path addLineToPoint:CGPointMake(i, i)];
    }

BeizerPath のレンダリング (Rob による提案) - これは遅いようです。

- (void)drawBezierAnimate:(BOOL)animate
{
    UIBezierPath *bezierPath = path;

    CAShapeLayer *bezier = [[CAShapeLayer alloc] init];

    bezier.path          = bezierPath.CGPath;
    bezier.strokeColor   = [UIColor blueColor].CGColor;
    bezier.fillColor     = [UIColor clearColor].CGColor;
    bezier.lineWidth     = 2.0;
    bezier.strokeStart   = 0.0;
    bezier.strokeEnd     = 1.0;
    [self.layer addSublayer:bezier];

    if (animate)
    {
        CABasicAnimation *animateStrokeEnd = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
        animateStrokeEnd.duration  = 100.0;
        animateStrokeEnd.fromValue = [NSNumber numberWithFloat:0.0f];
        animateStrokeEnd.toValue   = [NSNumber numberWithFloat:1.0f];
        [bezier addAnimation:animateStrokeEnd forKey:@"strokeEndAnimation"];
    }
}

質問:

1) これは、追加するパスが多すぎるためですか?

2) 最終的にはさまざまな色のさまざまな線を描画したいので、複数 (10000 以上) の UIBezierPaths を作成する必要があると思います。

3) どうすればこれを回避できますか?

よろしくお願いします。

4

2 に答える 2

2

これを十分に速く実行する方法はないと思います。

(イメージバッファへの)1回限りのレンダリングで機能する場合があります。しかし、アニメーションでは-いいえ。

ドキュメントでは、パス内のポイントの数に制限はありませんが、数千のポイントがあると、合理的な制限をはるかに超えていると思います。

ここではOpenGLが役立つかもしれません-誰かがチャイムを鳴らしてこれについてアドバイスを与えることができるかもしれません。

UIKitを単独で使用する場合は、おそらくいくつかのキャッシュレイヤーから画像を作成する必要があります。

于 2012-10-12T09:34:46.933 に答える
2

アンチエイリアシングが原因で UIBezierPath が遅いことがわかりました。私の解決策は、さまざまなドラッグ操作中にアンチエイリアシングをオフにし、ジェスチャが終了した後にアンチエイリアシングを有効にして再描画することです。

CGContextSetShouldAntialias(context, ...); を使用してこれを行うことができます。

于 2013-09-13T02:57:31.277 に答える