在嵌入式Linux中缓慢重新绘制Qwt图

时间:2014-05-27 17:14:00

标签: qt opengl embedded-linux qwt omap

我在为Linux开发基于Qt的嵌入式解决方案时遇到了一些问题。基本上我的应用程序绘制了一个QwtPlot图表,其中附加了多达8个QwtPlotCurves。每1秒调用一次QwtPlot :: replot()。数据从连接到同一系统中另一个.c应用程序的套接字连接到达。硬件是德州的一个' OMAP。

问题在于,根据配置,重新绘制变得非常非常慢。更具体地说,如果我显示4条曲线,则不会感觉到延迟,但如果我附加8条曲线,则会出现400-500毫秒的滞后/差值。

我开始调试系统以找到瓶颈所在的位置(有3个阶段:第一个接收点并保护它们在临时缓冲区内,中间处理很少,第二个将这些点复制到绘图点矢量中第三个就像一个调用QwtPlot :: replot()来更新图形的计时器,在丢弃了两个第一阶段之后,我认为真正的问题是围绕replot()方法:我希望,在调用它之前启动一个计时器并调用QTime :: elapsed()来看它花了多少时间,我发现了一个很大的数字。

但错了!与我面临的400-500毫秒的延迟相比,该方法只需要10-15毫秒。考虑到这一点,我提出了一个问题:QwtPlot :: replot()是否会调用某些事情然后继续前进,所以当我计算10 ms时,我的应用程序实际上运行了大量代码,或者我应该得出结论进行重新绘制所需的大量时间是硬件故障,无法正确处理工作?

顺便说一句,使用OpenGL(Qwt提供这种可能性)可以解决我的问题吗?不会因为其他任务而杀死处理器吗?

修改

  • OB的。 1:关于OpenGL,我已经(在SO中的另一个问题中)已经学会了我不能将它用于我现在的特定嵌入式情况,因为我的处理器没有GPU和任何其他使用OpenGL的方式实际上并没有帮助(详见此链接)。
  • OB的。 2:重新刷新刷新每秒进行一次,因此问题肯定不会来自过多的重新编程调用,并且使用部分重新绘制(通过QwtPlotDirectPainter或类似方法)是徒劳的。
  • OB的。 3:到现在为止,我重新实现了QwtPlot :: replot()方法,所以它现在只调用3个方法:

    updateAxes();
    
    poCanvas->invalidateBackingStore();
    poCanvas->update();
    

1 个答案:

答案 0 :(得分:1)

我实时绘制30多个数据,同时使用fft操作绘制到2个不同的图上,没有这样的延迟。我有我的观察;如果你正在使用实时数据,你可以得到一些想法:

尝试删除陈旧的曲线数据 - 清除所有内容,例如在重新绘制之前持续10秒。

由于您总是写入 future ,因此只有在需要移动绘图时才尝试调用replot,而不是在每次更新时调用。

尝试使用QwtPlotDirectPainter

尝试使用canvaspainter属性。

尝试更改接收方法smt,例如使用定时器检查套接字,而不是为每个接收到的字节触发一个插槽。

始终尝试将您的计时器移到单独的线程上。

编辑:让我们现在谈谈实际答案 - 我已经快速阅读了您的问题,抱歉:

Replot需要10ms,但“排队”的replots似乎是你的主要问题,你可能会解雇太多的replots(比如每一个毫秒),你的线程可能会排队这些事件。

在qwt 6.1中引入了OpenGL QwtPlotGLCanvas,您可以在qwt根文件夹下的 refreshtest 示例中进行测试。从那里你可以比较GPU + CPU和CPU。

还有一个示波器示例,您可以看到直接画家如何工作,如何利用它而不是慢速重绘,甚至使用CPU渲染,您可以获得对图的有效更新。 / p>