После добавления некоторых точек в QtChart он становится медленным

Мне нужна помощь. Вот мой код (показываю основную часть):

// Arduino Reader

    serial.setPortName("/dev/ttyACM0");
    serial.open(QIODevice::ReadWrite);
    serial.setBaudRate(QSerialPort::Baud9600);
    serial.setDataBits(QSerialPort::Data8);
    serial.setParity(QSerialPort::NoParity);
    serial.setStopBits(QSerialPort::OneStop);
    serial.setFlowControl(QSerialPort::NoFlowControl);
    connect(&serial,SIGNAL(readyRead()),this,SLOT(getNewData()));

...

void MainWindow::getNewData()
{
    std::clock_t starter = std::clock();
    QByteArray data = serial.readAll();
    QDataStream in(serial.readAll());
    getData = getData + data;

    int start = getData.indexOf(":START:");
    int end = getData.indexOf(":END:",start);
    QString nowWork = getData.mid(start,end-start+5);
    if (nowWork.startsWith(":START:") && nowWork.endsWith(":END:")){
        QStringList mod = nowWork.remove(":START:").remove(":END:").split(":");
        int xPoint = mod[0].toInt();
        int yPoint = mod[1].toInt();
        int zPoint = mod[2].toInt();
        int aPoint = mod[3].toInt();
        int bPoint = mod[4].toInt();
        int cPoint = mod[5].toInt();
        addQuery(1,xPoint,yPoint,zPoint);
        addQuery(2,aPoint,bPoint,cPoint);
        getData = getData.right(end+5);
    }
    std::clock_t ender = std::clock();
    ui->ping->setText(QString::number( (ender-starter)/ (double)CLOCKS_PER_SEC *100));
    return;
}

...

 void MainWindow::addQuery(int to, int x, int y, int z){
        seriesAllD1->append(now, (x+y+z)/3 );
        seriesXD1->append(now,x);
        seriesYD1->append(now,y);
        seriesZD1->append(now,z);
        seriesAllD1->remove(0);
        seriesXD1->remove(0);
        seriesYD1->remove(0);
        seriesZD1->remove(0);
        chartAllD1->axisX()->setRange(now-100,now);
        chartX->axisX()->setRange(now-100,now);
        chartY->axisX()->setRange(now-100,now);
        chartZ->axisX()->setRange(now-100,now);
        now++;
        return;
    }

Я пытаюсь описать код: 1) Он получает данные от arduino (например, ":START:X:Y:Z:A:B:C:END::START:..."). 2) Он получает показания от 2-х датчиков (3-х осевой акселерометр). И рисует графики.

Я показываю некоторый блок кода. После добавления ~ 900 точек он замедляется с 60 мс до 1000 мс. Я думаю, что это связано с QtChart (я использую их в проекте) или добавлением точек в серию. Помогите мне, пожалуйста(


person Abushkin17    schedule 09.04.2017    source источник


Ответы (1)


Это старая тема, однако я также столкнулся с ней при работе с QtCharts, поэтому: для тех, кто столкнется с теми же проблемами с QtCharts и также хотел бы использовать QtCharts, вот мои решения:

Используйте OpenGL:

  • вызовите setUseOpenGL(true) для серии на графике ( будет работать только с QLineSeries и QScatterSeries) - к сожалению, это не по умолчанию, но это может быть проблемой на некоторых системах

Если вы не используете OpenGL (то есть также используете QAreaSeries):

  • не использовать сглаживание
  • при добавлении больших объемов данных в один цикл в серию используйте вместо добавления вместо замены - см. https://stackoverflow.com/a/52334549/2056545

И вот этот специальный трюк придумал коллега при работе с данными в реальном времени:

  • установите для всех серий значение signalsBlocked(true), запустите таймер при блокировке , разблокировать через секунду, снова заблокировать и запустить таймер при повторном добавлении новых данных - это будет обновлять графики (примерно) каждую секунду, но влияние на производительность будет низким
person michael_s    schedule 05.08.2020