0

我的应用程序正在从外部硬件接收数据并将其绘制到面板上(实际上可以是“控制”的任何其他子项)。绘画当前发生在“OnPaint”回调中。列表用于存储最近收到的数据,以允许在 OnPaint 中重绘整个图形,以在调整窗口大小时获得正确的比例。

图形本身是e->Graphics使用两个数据点之间的线与元素一起绘制的。

这工作正常,但是当我每 50 毫秒收到新数据(= 重新绘制整个图表)时,图表很快开始闪烁。需要绘制的数据越多,闪烁越强(当到达控件的右侧时,数据缓存被清除,因此图中的最大数据点数是有限的)。

我的代码的主要部分:

void Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e)
{
    Size^ s = m_Control->Size;
    Bitmap^ bmp = gcnew Bitmap(s->Width, s->Height);
    Graphics^ g = Graphics::FromImage(bmp);

    for each(double y in m_Data)
    {
        /* ...calculations etc... */
        g->DrawLine(Pens::Blue, recentX, recentY, currentX, currentY);
    }           

    e->Graphics->DrawImageUnscaled(bmp, 0, 0);
}

有什么建议可以优化绘画以消除闪烁吗?提前致谢!

4

2 回答 2

1

独立于您的平台或语言,这是一种主要使用称为控制帧速率的方法解决的问题。

您将调用您的绘画方法,然后估计花费在绘画上的时间。现在您知道在一个步骤中花费了多少时间以及您的刷新间隔有多长 - 在您的情况下是 40 毫秒 -。您可以让线程休眠 (intervals - timespent) 毫秒。

顺便说一句,这是我的第一个答案,我知道我在解释东西方面很糟糕。

于 2012-04-09T00:01:34.510 回答
1

闪烁来自 WinForms 在调用您的 Paint 处理程序之前擦除背景。

您需要编写自己的继承自 Panel 的自定义控件,并重写OnPaintBackground以不执行任何操作(尤其是不要调用基类版本)。

于 2012-04-09T00:15:48.840 回答