我想反覆(每10ms)在Winform應用程序中繪製或繪製大量數據點(差不多500,000個點)。 我已經使用了一些常見的繪圖控件,但他們無法處理這個問題。他們變得太慢了。 我的程序做了另一個工作,所以它應該是有效的。如何反覆繪製或繪製c#中的大量點?
有什麼建議嗎? 謝謝。
我想反覆(每10ms)在Winform應用程序中繪製或繪製大量數據點(差不多500,000個點)。 我已經使用了一些常見的繪圖控件,但他們無法處理這個問題。他們變得太慢了。 我的程序做了另一個工作,所以它應該是有效的。如何反覆繪製或繪製c#中的大量點?
有什麼建議嗎? 謝謝。
由於屏幕中的像素數量少得多,所以繪製這種點數是沒有意義的。
我以前遇到類似的問題,我做了以下過程:
我減少了數據點的數量,使其更加方便。
例如,我意識到我不需要超過1000點,因爲像素數量。實際上理想的點數將是畫布寬度。然後,我計算每個像素繪製的數據點的數量。這就是說,如果您有500k個數據點,並且您的畫布是1000個像素,則意味着一個像素將繪製500個數據點。你看,在一列像素中繪製500個數據點是沒有意義的...
因此,我根據像素數量分組數據點列表。例如,對於第一個像素,我取前500個點,第二個像素,後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();
}
我的電腦是接近5歲DrawPoints
是4之間服用,以16ms的運行。還有很多優化可以嘗試,例如使用8位位圖或從多個線程更新部分位圖。
謝謝soooooo,這很好。你節省了我的時間。 – 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 = vs.90).aspx –