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