我想反复(每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 –