首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QChart实时性能

QChart实时性能
EN

Stack Overflow用户
提问于 2018-06-14 08:49:58
回答 1查看 4.4K关注 0票数 5

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

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

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

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

我的问题是,应用程序启动后很快就会被冻结。我试着删除更新图表的代码,一切看起来都很好。有人能帮我提高更新图表的性能吗?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2018-07-10 17:25:29

我也有同样的问题。我认为主要的问题是,QLineSeries发送信号pointAdded()并触发重绘。此外,append()remove是性能接收器。据我所知,QtChart只支持QList,不支持环形缓冲区。

我尝试了将新数据放入QQueue<QPointsF>并在定时器控制器中复制数据到20 Hz的方法。为了避免更新,我禁用了以下内容:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50853387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档