我正在使用 QChart 作为应用程序。该应用程序需要实时显示一些数据。将有一张图表和图表中的24个系列。每个通道的数据速率为400pts 。
我使用另一个线程来接收和处理接收到的数据,并将处理后的数据发送到插槽以附加数据以更新图表系列。
我参考了https://doc.qt.io/qt-5/qtcharts-audio-example.html。在我的例子中,每个系列限制为2000点,如果系列中的点数少于2000,则将新点添加到系列中,如果系列中的点数超过2000,则删除第一个点,将其余数据向左移动并在最后添加新点。这将使图表看起来像是从右向左移动。
为了获得良好的性能,我还使用了series->replace()和series->setUseOpenGL(true)。
我的问题是应用程序启动后很快就会被冻结。我尝试删除更新图表的代码,一切看起来都很好。谁能帮助我如何提高更新图表的性能?
谢谢!
我也有同样的问题。我认为主要问题是QLineSeries发送信号pointAdded()并触发重绘。另外append()和remove是性能下降点。QList据我所知,QtChart 仅支持而不支持任何形式的环形缓冲区。
我尝试了将新数据放入QQueue<QPointsF>并在设置为 20 Hz 的计时器处理程序中复制数据的方法。为了避免更新,我禁用这些:
void
MyGraph::handle_timer_timeout()
{
_chartView->setUpdatesEnabled(false);
// _chart->removeSeries(_series);
while(_buf->count()>0){
_series->append(_buf->dequeue());
_series->remove(0);
}
// _chart->addSeries(_series);
_axisX->setRange( _series->at(0).x(),
_series->at(_seriesSize-1).x());
_axisY->setRange(-1,1);
_chartView->setUpdatesEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)
这会导致处理器使用量减少大约 20-30%。
我还发现暂时删除系列(removeSeries()、addseries())可以带来一些改进的提示,但我无法确认这一点。
这可能更好,但还不够好。我希望有人找到更好的解决方案。
或使用QLineSeries::replace(). 为此,我使用双缓冲区QVector<QVector<QPointF>> *_lists:
void
MyGraph::handle_timer_timeout()
{
_chartView->setUpdatesEnabled(false);
auto listsother = (_listsCrurrent+1)%2;
auto bufcnt = _buf->count();
//
QVector<QPointF> *newData = &_lists->data()[listsother];
int idx;
for(idx=0; idx<_seriesSize-bufcnt;idx++){
newData->replace(
idx,
_lists->at(_listsCrurrent).at(idx+bufcnt));
}
for(; idx<_seriesSize;idx++){
newData->replace(
idx,
_buf->dequeue());
}
_listsCrurrent = listsother;
_series->replace(_lists->at(_listsCrurrent));
_axisX->setRange( _series->at(0).x(),
_series->at(_seriesSize-1).x());
_axisY->setRange(-1,1);
_chartView->setUpdatesEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)
这在我的计算机上性能更高。
或者你可以看看QWT。
| 归档时间: |
|
| 查看次数: |
5134 次 |
| 最近记录: |