0

何百ものポイントを含むベジエ曲線をレンダリングしたいと考えています。この曲線は、ヒット テスト可能または対話可能である必要はありません。そのため、Visual が最も軽量であると思われるため、Visual を試してみようと考えました。

ただし、以下のコードを使用すると、アプリケーションの残りの部分の実行が遅くなるのはなぜでしょうか? たとえば、ウィンドウのサイズ変更は非常に遅くなります。

入力処理機能を使用せずに曲線をレンダリングする最も効率的な方法を探しているだけです (この例でも、MouseOver イベントに接続でき、カーソルが実際に線の上にあるときにのみ発生するため、私はまだそのためにお金を払っているようです ( IsHitTestVisiable を設定してもパフォーマンスは向上しないようです))

public class VisualHost : FrameworkElement
{
    VisualCollection _children;

    public VisualHost()
    {
        _children = new VisualCollection(this);
        _children.Add(CreateDrawingVisualRectangle());

    }

    DrawingVisual CreateDrawingVisualRectangle()
    {
        var drawingVisual = new DrawingVisual();
        var drawingContext = drawingVisual.RenderOpen();

        var geometry = new StreamGeometry();
        using (var ctx = geometry.Open())
        {
            ctx.BeginFigure(new Point(0, 0), false, false);
            var r = new Random();

            for (int i = 0; i < 500; ++i)
            {
                var p1 = new Point(r.Next(0, 1000), r.Next(0, 1000));
                var p2 = new Point(r.Next(0, 1000), r.Next(0, 1000));
                ctx.QuadraticBezierTo(p1, p2, true, false);
            }
        }

        geometry.Freeze();

        drawingContext.DrawGeometry(null, new Pen(Brushes.Red, 1), geometry);
        drawingContext.Close();

        return drawingVisual;
    }

    protected override int VisualChildrenCount
    {
        get { return _children.Count; }
    }

    protected override Visual GetVisualChild(int index)
    {
        if (index < 0 || index >= _children.Count)
        {
            throw new ArgumentOutOfRangeException();
        }

        return _children[index];
    }
}

public partial class MainWindow : Window
{
    public MainWindow()
    {
        Content = new VisualHost();
    }
}
4

1 に答える 1