После добавления некоторых точек в 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 (я использую их в проекте) или точки добавления в серию. Пожалуйста, помогите мне(
0 ответов
Это старая тема - однако я также столкнулся с ней при работе с QtCharts - так что: для тех, кто наткнется на те же проблемы с QtCharts и также хотел бы использовать QtCharts, вот мои решения:
Используйте OpenGL:
- вызовите setUseOpenGL(true) для серии в графике (будет работать только с QLineSeries и QScatterSeries) - к сожалению, это не по умолчанию, но это может быть проблемой в некоторых системах
Когда не используется OpenGL (т.е. также используется QAreaSeries):
- не использовать AntiAliasing
- при добавлении больших объемов данных в один цикл в серию используйте вместо добавления - см. /questions/16252836/qchart-ne-otvechaet-s-bolshim-naborom-dannyih/16252839#16252839
И вот особый трюк, который придумал коллега при работе с данными в реальном времени:
- установить для всех серий значение signalBlocked(true), запустить таймер при блокировке, разблокировать через секунду, снова заблокировать и запустить таймер при повторном добавлении новых данных - это будет обновлять графики каждые (примерно) каждую секунду, но влияние на производительность невелико