我有一个代码库,该代码库使用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