Winformアプリケーションで大量のデータポイント(ほぼ50万ポイント)を繰り返し描画(10msごと)する必要があります。 私はいくつかの一般的なプロットコントロールを使用しましたが、これを処理することはできません。彼らは遅すぎる。 私のプログラムは効率的になるように別の仕事をします。C#で大量のポイントを繰り返し描画する方法はありますか?
提案がありますか?おかげさまで
Winformアプリケーションで大量のデータポイント(ほぼ50万ポイント)を繰り返し描画(10msごと)する必要があります。 私はいくつかの一般的なプロットコントロールを使用しましたが、これを処理することはできません。彼らは遅すぎる。 私のプログラムは効率的になるように別の仕事をします。C#で大量のポイントを繰り返し描画する方法はありますか?
提案がありますか?おかげさまで
画面のピクセル数がはるかに少ないので、このような点を描画することは意味がありません。
私は同様の問題を抱えていましたが、次のプロセスを実行しました。
私はデータポイントの数をもっと便利に減らしました。
たとえば、ピクセル数のために1000ポイントを超える必要はないことに気づきました。実際、理想的な点数はキャンバスの幅になります。 次に、ピクセルごとに描画するデータポイントの数を計算します。これは、500kデータポイントがあり、キャンバスが1000ピクセルの場合、ピクセルが500データポイントを描画することを意味します。あなたは、ピクセルの列に500のデータ点を描くのは意味がありません。
したがって、ピクセル数に応じてデータポイントリストをグループに分割しました。例えば、最初のピクセルについては、最初の500ポイント、2番目のピクセル、次の500データポイントなどを取る。
ピクセルの列に500データポイントを描画するには、基本的に最大値と最小値を特定し、垂直線を描画します。
このアプローチをお勧めします。
Windowsフォームはこれにはあまり適していないかもしれませんが、試してみないとわからないと思います。 This answerは良い出発点です。私は、ピクチャボックスにDirectBitmap
を割り当てる:
_bitmap = new DirectBitmap(pictureBox1.Width, pictureBox1.Height);
pictureBox1.Image = _bitmap.Bitmap;
その後、私は、私は継続的に別のスレッドでランダムデータを更新しています50万点の配列を作成しました:
private const int _numPoints = 500000;
private static Point[] _points = new Point[_numPoints];
を今、私は(ビットマップをクリア黒にする)、個々のピクセルを設定して点を描画します。この10msごとに電話:
private void DrawPoints() {
Array.Clear(_bitmap.Bits, 0, _bitmap.Bits.Length);
int color = Color.Gray.ToArgb();
for (int i = 0; i < _numPoints; i++) {
int bmpIndex = _points[i].X + _points[i].Y * pictureBox1.Width;
_bitmap.Bits[bmpIndex] = color;
}
pictureBox1.Invalidate();
}
私のPCは、5歳とDrawPoints
を実行するために16msのに4間取っているに近いです。 8ビットのビットマップを使用したり、複数のスレッドからビットマップの一部を更新するなど、もっと多くの最適化を試みることができます。
すごくありがとう、よかった。あなたは私の時間を救った。 – jamshid
私はあなたがこれを行うことができますか。おそらくWPFがそれを処理できます。 – TaW
[グラフプロット用のシンプルなC#ライブラリ](https://www.codeproject.com/Articles/32836/A-simple-C-library-for-graph-plotting) –
https://msdn.microsoft.com/ en-us/library/sfwzeec0(v = 90).aspx –