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