如何反复绘制或绘制c#中的大量点数?

时间:2017-07-14 08:29:45

标签: c# winforms plot

我想重复绘制或绘制Winform应用程序中的大量数据点(几乎500,000点)(每10ms)。 我使用了一些常见的绘图控件,但他们无法处理这个问题。它们变得太慢了。 我的程序做了另外的工作,所以它应该是有效的。

有什么建议吗? 感谢。

2 个答案:

答案 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个数据点,基本上我找到最大值和最小值并绘制一条垂直线。

希望这种方法可以帮助你。