2017-07-14 10 views
-2

Winformアプリケーションで大量のデータポイント(ほぼ50万ポイント)を繰り返し描画(10msごと)する必要があります。 私はいくつかの一般的なプロットコントロールを使用しましたが、これを処理することはできません。彼らは遅すぎる。 私のプログラムは効率的になるように別の仕事をします。C#で大量のポイントを繰り返し描画する方法はありますか?

提案がありますか?おかげさまで

+0

私はあなたがこれを行うことができますか。おそらくWPFがそれを処理できます。 – TaW

+0

[グラフプロット用のシンプルなC#ライブラリ](https://www.codeproject.com/Articles/32836/A-simple-C-library-for-graph-plotting) –

+0

https://msdn.microsoft.com/ en-us/library/sfwzeec0(v = 90).aspx –

答えて

1

画面のピクセル数がはるかに少ないので、このような点を描画することは意味がありません。

私は同様の問題を抱えていましたが、次のプロセスを実行しました。
私はデータポイントの数をもっと便利に減らしました。

たとえば、ピクセル数のために1000ポイントを超える必要はないことに気づきました。実際、理想的な点数はキャンバスの幅になります。 次に、ピクセルごとに描画するデータポイントの数を計算します。これは、500kデータポイントがあり、キャンバスが1000ピクセルの場合、ピクセルが500データポイントを描画することを意味します。あなたは、ピクセルの列に500のデータ点を描くのは意味がありません。

したがって、ピクセル数に応じてデータポイントリストをグループに分割しました。例えば、最初のピクセルについては、最初の500ポイント、2番目のピクセル、次の500データポイントなどを取る。

ピクセルの列に500データポイントを描画するには、基本的に最大値と最小値を特定し、垂直線を描画します。

このアプローチをお勧めします。

+0

ありがとう、私は散布図があり、それは600 * 600ピクセルだと考えてください。 – jamshid

+0

これは私が360、000点を持っていることを意味します – jamshid

+0

Hum、私はあなたが600点を処理しなければならないと言います。これは、データポイントの600グループです。 – oarrivi

1

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ビットのビットマップを使用したり、複数のスレッドからビットマップの一部を更新するなど、もっと多くの最適化を試みることができます。

+0

すごくありがとう、よかった。あなたは私の時間を救った。 – jamshid

関連する問題