使用QWTPlotCurve进行有效的曲线绘图

Efficient curve plotting using QwtPlotCurve

本文关键字:曲线 绘图 有效 QWTPlotCurve 使用      更新时间:2023-10-16

我有一个代码库,该代码库使用QT库绘制许多类似范围的曲线。我们正在尝试优化此应用程序的运行时间(因为我们在CPU使用时到达了墙)。经过一些分析后,我发现主要数据绘图循环从QWT库中调用此功能:

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

这是每100毫秒每100ms完成的。结果,每100ms都有一个new呼叫QwtPointArrayData对象,然后在每个范围上的每个曲线都有一个delete调用CC_3调用。

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

内存分配可能会在任何程序中引起严重的瓶颈,具体取决于其被调用的频率。就性能而言,这是一个非常昂贵的指令,应该始终降低建筑,以免发生这种情况。有很多更好的方法,您绝对不需要重新分配QwtPointArrayData的新内存。查看QWT库的示例,例如示波器实时。基本上,您可以使用QwtDirectPainter及其函数drawSeries,它需要作为参数qplotcurve和您希望绘制的样本数量。

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

当然,您必须通过setSamples()或setRawsamples指令设置曲线的样本

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

这是一种非常有效的方法。但是,再次,请访问库的文件夹示例查找示波器 realtime 示例,并研究库本身,因为可能会有其他可以更适合您的方法。

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