C++ 使用QwtPlotCurve高效绘制曲线

C++ 使用QwtPlotCurve高效绘制曲线,c++,qt,qt5,qwt,C++,Qt,Qt5,Qwt,我有一个代码库,它使用QT库绘制了许多类似范围的曲线。我们正试图优化这个应用程序的运行时间(因为我们在CPU使用率方面遇到了瓶颈)。经过一些分析后,我发现主数据绘图循环从QWT库调用此函数: void QwtPlotCurve::setSamples( const QVector<double> &xData, const QVector<double> &yData ) { setData( new QwtPointArrayData( xDat

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

void QwtPlotCurve::setSamples( const QVector<double> &xData, const QVector<double> &yData )
{
    setData( new QwtPointArrayData( xData, yData ) );
}
void QwtPlotCurve::设置样本(常量QVector和扩展数据、常量QVector和yData)
{
setData(新的QwtPointArrayData(扩展数据,yData));
}
每100毫秒进行一次。因此,对于
QwtPointArrayData
对象,每隔100ms就会有一个
new
调用,然后对于每个范围上的每条曲线,就会有一个
delete
调用以前版本的
QwtPointArrayData
对象


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

内存分配可能会在任何程序中造成严重的瓶颈,具体取决于调用的频率。就性能而言,这是一个非常昂贵的指令,我们应该始终设计一个体系结构,这样就不会发生这种情况。 有很多更好的方法,您完全不需要为
QwtPointArrayData
重新分配新内存。看看qwt库的示例,例如示波器实时。基本上,您可以使用一个
QwtDirectPainter
及其函数
drawSeries
,它需要一个QPlotCurve和您希望绘制的样本数作为参数

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

这是一种非常有效的方法。但同样,请转到库的文件夹examples,查找示波器实时示例,并研究库本身,因为可能还有其他更适合您的方法

编辑:
起初我不明白这是库中的代码片段。我认为您应该尝试使用setRawSamples,因为它应该更有效

内存分配可能会在任何程序中造成严重的瓶颈,具体取决于调用的频率。就性能而言,这是一个非常昂贵的指令,我们应该始终设计一个体系结构,这样就不会发生这种情况。 有很多更好的方法,您完全不需要为
QwtPointArrayData
重新分配新内存。看看qwt库的示例,例如示波器实时。基本上,您可以使用一个
QwtDirectPainter
及其函数
drawSeries
,它需要一个QPlotCurve和您希望绘制的样本数作为参数

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

这是一种非常有效的方法。但同样,请转到库的文件夹examples,查找示波器实时示例,并研究库本身,因为可能还有其他更适合您的方法

编辑:
起初我不明白这是库中的代码片段。我想你应该试试setRawSamples,因为它应该更有效

谢谢你@danmar。我将尝试
setRawSamples
。然而,它确实有一个缺点,那就是我必须在绘图(和程序)期间保持原始数组的活动状态。如果我继续向数组的末尾添加新数据,为了清除前面的数据,我必须每次将所有数据复制一个元素。这应该不是问题,因为您使用的是QVector类,它具有诸如remove(int)或removeFirst()等指令。问题在于
QVector::removeFirst()
是指它必须移动并可能动态地重新分配向量中的数据,以确保
[0]
仍然返回第一个元素,
QVector::constData()
返回一个连续数组。是的,数据重新分配确实发生了,至少根据QVector的文档是这样的。也许你可以考虑使用一种动态方法来存储样本,比如类QLIST,因为当添加/删除/移动向量元素时,这个类引入更少的开销。但是,为了进行绘图,您必须将QList向量转换为QVector thanky you@danmar。我将尝试
setRawSamples
。然而,它确实有一个缺点,那就是我必须在绘图(和程序)期间保持原始数组的活动状态。如果我继续向数组的末尾添加新数据,为了清除前面的数据,我必须每次将所有数据复制一个元素。这应该不是问题,因为您使用的是QVector类,它具有诸如remove(int)或removeFirst()等指令。问题在于
QVector::removeFirst()
是指它必须移动并可能动态地重新分配向量中的数据,以确保
[0]
仍然返回第一个元素,
QVector::constData()
返回一个连续数组。是的,数据重新分配确实发生了,至少根据QVector的文档是这样的。也许你可以考虑使用一种动态方法来存储样本,比如类QLIST,因为当添加/删除/移动向量元素时,这个类引入更少的开销。但是,为了进行绘图,必须将QList向量转换为QVector