3

次の XAML を使用して、WPF で波形をプロットしています。

<Canvas>
    <Path Stroke="Black" StrokeThickness="3">
        <Path.Data>
            <PathGeometry>
                <PathFigure x:Name="figure" IsClosed="False">
                    <PathFigure.Segments>
                        <PolyLineSegment x:Name="polyline"/>
                    </PathFigure.Segments>
                </PathFigure>
            </PathGeometry>
        </Path.Data>
    </Path>
</Canvas>

32ミリ秒ごとに実行される単純なタイマーがあり、ラインにランダムなポイントを追加するだけです。

private void dispatcherTimer_Tick(object sender, EventArgs e)
{
     xPos++;
     polyline.Points.Add(new Point(xPos, yPos + ((int)(rnd.NextDouble() * 10) - 5)));
}

これは問題なく動作しますが、10 行以上で同じことを行うとすぐに、CPU 使用率が屋根を通り抜けました。

WPF Profiler (Perforator) を使用してアプリケーションを調べると、WPF が、変更を画面に更新するだけでなく、PathGeometry 全体を「ダーティ リージョン」としてマークしていることがわかります。そのため、1 つのピクセルだけが変更されたことに気付く代わりに、更新のたびにほぼ完全なフォームを再描画します。

これが過度の CPU 使用率の理由かどうかはわかりませんが、誰かがこの (非常に単純な) プログラムを最適化する方法、または私が間違っていることを教えてもらえますか?

4

1 に答える 1

0

リアルタイムのプロットでは、単純な描画操作を直接呼び出すことができる、より低レベルのものを使用した方がよいでしょうDrawingVisual

于 2013-01-28T19:00:30.910 に答える