QChart实时性能

5
我正在使用QChart制作一个应用程序。该应用程序需要实时显示一些数据。图表中将有一个图表24个系列。每个通道的数据速率为400pts
我使用另一个线程来接收和处理接收到的数据,并将处理后的数据发射到插槽以附加数据以更新图表系列。
我参考了https://doc.qt.io/qt-5/qtcharts-audio-example.html。在我的情况下,每个系列限制为2000个点,如果系列中的点数少于2000,则将新点添加到系列中,如果系列中的点数超过2000,则删除第一个点,将其余数据向左移动并在末尾添加新点。这将使图表从右向左移动。
为了获得良好的性能,我还使用了series->replace()series->setUseOpenGL(true)
我的问题是应用程序一启动就会很快卡死。我尝试删除更新图表的代码,一切看起来都很好。有人能帮我提高更新图表性能吗?
谢谢!
2个回答

2
我有同样的问题。我认为主要问题是QLineSeries发送信号pointAdded()并触发了重绘。此外,append()remove()会降低性能。据我所知,QtChart仅支持QList而不支持任何形式的环形缓冲区。
我尝试了将新数据放入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);
}

这将导致处理器使用量减少大约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);
}

在我的电脑上,这更加高效。


或者您可以查看QWT


-1
阅读Qt示例“OpenGL Accelerated Series Example”。这应该解决您的问题。我已经在不同的项目中使用QChart。其中一个同时启动了14个图表,没有任何问题。我认为QChart非常棒。

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - user16217248

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接