我在为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的。 3:到现在为止,我重新实现了QwtPlot :: replot()方法,所以它现在只调用3个方法:
updateAxes();
poCanvas->invalidateBackingStore();
poCanvas->update();
答案 0 :(得分:1)
我实时绘制30多个数据,同时使用fft操作绘制到2个不同的图上,没有这样的延迟。我有我的观察;如果你正在使用实时数据,你可以得到一些想法:
尝试删除陈旧的曲线数据 - 清除所有内容,例如在重新绘制之前持续10秒。
由于您总是写入 future ,因此只有在需要移动绘图时才尝试调用replot,而不是在每次更新时调用。
尝试使用QwtPlotDirectPainter
。
尝试更改接收方法smt,例如使用定时器检查套接字,而不是为每个接收到的字节触发一个插槽。
始终尝试将您的计时器移到单独的线程上。
编辑:让我们现在谈谈实际答案 - 我已经快速阅读了您的问题,抱歉:
Replot需要10ms,但“排队”的replots似乎是你的主要问题,你可能会解雇太多的replots(比如每一个毫秒),你的线程可能会排队这些事件。
在qwt 6.1中引入了OpenGL QwtPlotGLCanvas
,您可以在qwt根文件夹下的 refreshtest 示例中进行测试。从那里你可以比较GPU + CPU和CPU。
还有一个示波器示例,您可以看到直接画家如何工作,如何利用它而不是慢速重绘,甚至使用CPU渲染,您可以获得对图的有效更新。 / p>