我有一个代码库,使用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
对象,对于每个范围的每条曲线。
我的问题是:有没有更好的方法来绘制数据而无需在每次更新时重新分配数据?
内存分配可能会导致任何程序出现严重瓶颈,具体取决于调用的频率。就性能而言,这是一个非常昂贵的指令,并且应该总是设计一个架构,这样就不会发生这种情况。有很多更好的方法,你绝对不需要为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