我想重复绘制或绘制Winform应用程序中的大量数据点(几乎500,000点)(每10ms)。 我使用了一些常见的绘图控件,但他们无法处理这个问题。它们变得太慢了。 我的程序做了另外的工作,所以它应该是有效的。
有什么建议吗? 感谢。
答案 0 :(得分:2)
Windows Forms可能不是一个很好的选择,但我认为除非你尝试,否则你真的不知道。 This answer是一个很好的起点。我为照片框指定了DirectBitmap
:
_bitmap = new DirectBitmap(pictureBox1.Width, pictureBox1.Height);
pictureBox1.Image = _bitmap.Bitmap;
然后我创建了一个500,000个点的数组,我不断用另一个线程中的随机数据进行更新:
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到16毫秒才能运行。您可以尝试更多优化,例如使用8位位图或从多个线程更新位图的部分。
答案 1 :(得分:1)
绘制如此数量的点是没有意义的,因为屏幕中的像素数要少得多。
我在很久以前遇到过类似的问题而且我做了以下过程:
我将数据点的数量减少到更方便的东西。
例如,我意识到由于像素数量的原因,我不需要超过1000个点。实际上,理想的点数是画布宽度。 然后,我计算每个像素绘制的数据点数。这是,如果你有500k数据点,并且你的画布是1000像素,这意味着一个像素将绘制500个数据点。你知道,在一列像素中绘制500个数据点是没有意义的......
因此,我根据像素数将数据点列表分组。例如,对于第一个像素,我取前500个点,第二个像素,接下来的500个数据点,依此类推。
要在一列像素中绘制500个数据点,基本上我找到最大值和最小值并绘制一条垂直线。
希望这种方法可以帮助你。