2017-07-14 97 views
-2

我想反覆(每10ms)在Winform應用程序中繪製或繪製大量數據點(差不多500,000個點)。 我已經使用了一些常見的繪圖控件,但他們無法處理這個問題。他們變得太慢了。 我的程序做了另一個工作,所以它應該是有效的。如何反覆繪製或繪製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 = vs.90).aspx –

回答

1

由於屏幕中的像素數量少得多,所以繪製這種點數是沒有意義的。

我以前遇到類似的問題,我做了以下過程:
我減少了數據點的數量,使其更加方便。

例如,我意識到我不需要超過1000點,因爲像素數量。實際上理想的點數將是畫布寬度。然後,我計算每個像素繪製的數據點的數量。這就是說,如果您有500k個數據點,並且您的畫布是1000個像素,則意味着一個像素將繪製500個數據點。你看,在一列像素中繪製500個數據點是沒有意義的...

因此,我根據像素數量分組數據點列表。例如,對於第一個像素,我取前500個點,第二個像素,後500個數據點,依此類推。

要在一列像素中繪製500個數據點,基本上我找到最大值和最小值並畫出一條垂直線。

希望這種方法可以幫助你。

+0

謝謝,考慮我有一個散點圖,它是600 * 600像素。 – jamshid

+0

這意味着我有360,000點 – jamshid

+0

嗯,我會說你必須處理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(); 
} 

我的電腦是接近5歲DrawPoints是4之間服用,以16ms的運行。還有很多優化可以嘗試,例如使用8位位圖或從多個線程更新部分位圖。

+0

謝謝soooooo,這很好。你節省了我的時間。 – jamshid