使用QwtPlotCurve进行高效曲线绘图

问题描述 投票:0回答:1

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

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

这是每100毫秒完成的。结果,每隔100ms就有一个new调用QwtPointArrayData对象,然后有一个delete调用前一版本的QwtPointArrayData对象,对于每个范围的每条曲线。

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

c++ qt qt5 qwt
1个回答
0
投票

内存分配可能会导致任何程序出现严重瓶颈,具体取决于调用的频率。就性能而言,这是一个非常昂贵的指令,并且应该总是设计一个架构,这样就不会发生这种情况。有很多更好的方法,你绝对不需要为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#aa51cd3fa00f2a046ca5a9889c5db2413

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

编辑:我起初并不理解这是来自库的代码片段。我认为你应该尝试使用setRawSamples,因为它应该更有效https://qwt.sourceforge.io/class_qwt_plot_curve.html#afd13c94e23520dacbc37b4d0fd036a8b

© www.soinside.com 2019 - 2024. All rights reserved.