【问题标题】:Accelerate 2d Drawing加速二维绘图
【发布时间】:2009-11-13 00:28:46
【问题描述】:

我正在尝试制作 2D 实时绘图。我尝试修改 qwt 的示波器示例,尝试使用 QGraphicsView 和 QPainter 来达到高帧率绘图。我正在使用 8 个通道来绘制来自 rs232 端口的数据。我每 10 毫秒采样一次。 也许我以错误的方式使用了 QPainter,但我无法快速绘制。以 qwt 为例,它不会更新整个屏幕,绘图速度很好,尤其是在 X11 中使用 Qt::WA_PaintOutsidePaintEvent 和 Qt::WA_PaintOnScreen。

现在我将 QGLWidget 子类化,并且我达到了可以接受的速度。但我想知道我是否可以改进它。

每次我收到一个新点时,我都会存储它,然后调用 updateGL(); 在这种情况下,我只收到了 y 坐标,但我将收到整对。

void Plot::addPoint(int y)
{
   points[t].x=t;
   points[t].y=y;
   t++;
   updateGL();
}

在 DrawGL() 中,我检查行是否到达屏幕的末尾,如果是 True,我会擦除屏幕 如果没有,我只画线的新部分。

  glBegin(GL_LINES);
    glVertex2i( points[t-1].x, points[t-1].y);
    glVertex2i( points[t-2].x, points[t-2].y);
 glEnd();

我已禁用抖动和多重采样,并且我使用的是平面阴影。 我正在使用正投影。

有什么方法可以画得更快吗?也许使用opengl进行离屏绘图并显示相应的像素图? 有没有类似的项目?

【问题讨论】:

    标签: qt opengl 2d plot


    【解决方案1】:

    顶点缓冲区对象(可能还有显示列表)会对此有所帮助。基本上,您需要一种减少 GL 调用次数的方法,而且速度会很快。

    【讨论】:

    • 我刚刚尝试过使用顶点数组,它有点快。现在我要看看显示列表和 VBO(这有点复杂,不是吗?)
    • 是的,它们并不像您现在所拥有的那么简单。此外,在我看来,您可能应该将点数组视为循环缓冲区,并在每次调用 DrawGL 时重绘整个事物。这将使其尽可能简单,并且看起来应该相同。 (可能会更好;屏幕右侧的闪烁会减少。)
    • 我已经尝试清除整个场景并在每个 drawGl 中重新绘制所有场景,但是速度真的很慢。但是,我不知道,我正在重绘 8 个小部件,每个小部件至少 800 点。双缓冲使情况变得更糟。我肯定做错了什么。使用 SingleBuffer 并仅绘制曲线的最后部分,我得到半可接受的速度:S 可能制作 1 个带有 8 行的小部件?
    猜你喜欢
    • 2011-01-05
    • 2016-07-20
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    相关资源
    最近更新 更多