我有一个使用QT库绘制许多类似示波器曲线的代码库。我们正在尝试优化此应用程序的运行时间(因为我们已达到CPU使用率极限)。经过一些分析后,我发现主数据绘图循环从QWT库调用了此函数:
void QwtPlotCurve::setSamples( const QVector<double> &xData, const QVector<double> &yData )
{
setData( new QwtPointArrayData( xData, yData ) );
}
这是每100ms完成一次。结果,对于每条曲线,每100毫秒对new
对象进行一次QwtPointArrayData
调用,然后对delete
对象的先前版本进行一次QwtPointArrayData
调用。每个范围。
我的问题是:有没有一种更好的更有效的方法来绘制数据而无需在每次更新时重新分配它?
答案 0 :(得分: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
这是一种非常有效的方法。但是同样,请转到库的 examples 文件夹中,找到示波器和实时示例,并研究库本身,因为可能存在其他更适合您的方法。
编辑: 起初我不明白这是库中的代码片段。我认为您应该改用setRawSamples,因为它应该更有效https://qwt.sourceforge.io/class_qwt_plot_curve.html#afd13c94e23520dacbc37b4d0fd036a8b