【问题标题】:QChart realtime performanceQChart 实时性能
【发布时间】:2018-11-23 23:44:42
【问题描述】:

我正在将 QChart 用于应用程序。应用程序需要实时显示一些数据。图表中会有一个图表24个系列。数据速率为每个通道 400pts

我使用另一个线程来接收和处理接收到的数据,并将处理后的数据发送到一个插槽以添加数据以更新图表系列。

我提到了https://doc.qt.io/qt-5/qtcharts-audio-example.html。就我而言,每个系列限制为 2000 个点,如果系列中的点数小于 2000,则将新点添加到系列中,如果系列中的点数超过 2000,则删除第一个点,将其余数据向左移动并在最后添加新点。这将使图表看起来像从右向左移动。

为了获得良好的性能,我还使用了series->replace()series->setUseOpenGL(true)

我的问题是应用程序在启动时很快就会冻结。我尝试删除更新图表的代码,一切看起来都很好。谁能帮助我如何提高更新图表的性能?

谢谢!

【问题讨论】:

    标签: c++ qt qt5 qchart


    【解决方案1】:

    我也有同样的问题。我认为的主要问题是,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

    【讨论】:

      猜你喜欢
      • 2023-02-19
      • 1970-01-01
      • 2018-09-13
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多