現在、深い強化学習の実装を進めています。トレーニングの進行状況を確認するために、私は以下のUIを作成しました。テキストボックスと両方のグラフは、whileループの最後に毎回更新されます。このループは、スロットマシンをシミュレートし、ニューラルネットワークを訓練するスレッド内で実行されます。パフォーマンスプロファイラは、CPU使用率の87%がメインスレッド(UI実行中)によって消費され、残りはシミュレーションスレッド用に残されていることを示します。動的リアルタイムデータを表示するためのUIパフォーマンスを改善する
誰でも、UIのコストを大幅に削減するための良いアプローチを知っていますか?
private delegate void AppendChartCallback(Chart chart, double x, double y);
private void AppendChart(Chart chart, double x, double y)
{
if (chart.InvokeRequired)
{
AppendChartCallback d = new AppendChartCallback(AppendChart);
Invoke(d, new object[] { chart, x, y });
}
else
{
chart.Series[0].Points.AddXY(x, y);
if (chart.Series[0].Points.Count % 20 == 0)
{
chart.Refresh();
}
}
}
編集:私はチャート更新を一時停止し、(モジュロに基づく)とすぐにデータのいくつかのより多くの量が追加されるようになりましリフレッシュ個別に呼び出します。
グラフへのポイントを追加する呼び出しが再描画を引き起こしていると仮定します。どのチャートコントロールを使用していますか?系列が更新されるたびにグラフが定期的に転送されるように、再描画を延期することは可能ですか? – Charleh
一番最初に試してみると、電話をバッチしてください。おそらくすべての単一の値を即座にディスパッチする必要はないでしょう。それは多くのサイクルを要します。 –
コントロールの使用 System.Windows.Forms.DataVisualization.Charting.Chart – MarcoMeter