使用 QwtPlotCurve 进行高效曲线绘制

Efficient curve plotting using QwtPlotCurve

我有一个代码库,它使用 QT 库绘制许多类似示波器的曲线。我们正在尝试优化此应用程序的 运行 时间(因为我们在 CPU 用法上达到了极限)。经过一些分析后,我发现主数据绘图循环从 QWT 库中调用了这个函数:

void QwtPlotCurve::setSamples( const QVector<double> &xData, const QVector<double> &yData )
{
    setData( new QwtPointArrayData( xData, yData ) );
}

每 100 毫秒执行一次。结果,每 100 毫秒有一个 new 调用 QwtPointArrayData 对象,然后有一个 delete 调用以前版本的 QwtPointArrayData 对象,对于每条曲线每个范围。

我的问题是:是否有更好更有效的方法来绘制数据而无需在每次更新时重新分配数据?

内存分配可能会在任何程序中造成严重的瓶颈,具体取决于它被调用的频率。就性能而言,这是一条非常昂贵的指令,应该始终设计一种体系结构,以免发生这种情况。 有很多更好的方法,你绝对不需要为 QwtPointArrayData 重新分配新的内存。看看qwt库的例子,比如oscilloscope或者realtime。基本上您可以使用 QwtDirectPainter 及其函数 drawSeries,它需要 QPlotCurve 和您希望绘制的样本数作为参数。

https://qwt.sourceforge.io/class_qwt_plot_direct_painter.html

当然要通过setSamples()或setRawSamples指令来设置曲线的样本

https://qwt.sourceforge.io/class_qwt_plot_curve.html#aa51cd3fa00f2a046ca5a9889c5db2413

这是一种非常有效的方法。不过还是去库的文件夹examples里找oscilloscoperealtime的例子,研究下库本身,因为可能还有其他方法更适合您。

编辑: 起初我不明白这是图书馆的代码片段。我认为您应该改用 setRawSamples,因为它应该更有效率 https://qwt.sourceforge.io/class_qwt_plot_curve.html#afd13c94e23520dacbc37b4d0fd036a8b