У меня есть данные, которые поступают с частотой 1000 значений в секунду с нескольких каналов. Нужно построить графики для каждого канала. Я делаю это с помощью QTimer, который сначала забирает данные (забирает с частотой 100 Гц, данные буферизуются устройством) и каждый второй кадр обновляет графики (чтобы частота обновления была 50 Гц, а не 100, потому что всё равно у монитора 60 Гц и больше нет смысла), которые рисуются на QGraphicsView.
QGraphicsScene *graphScene, *tempGraphScene;
...
tempGraphScene->clear();
static const QColor colors[8] = {QColor(255, 0, 0), QColor(0, 255, 0), QColor(0, 0, 255), QColor(255, 255, 0),
QColor(0, 255, 255), QColor(255, 0, 255), QColor(128, 128, 128), QColor(0, 0, 0)};
for (int i = 0; i < ui->channelListWidget->count(); i++) {
QPen pen(colors[i % 8]);
QString name = ui->channelListWidget->item(i)->text();
int t = 0, prev_t = 0, prev_y = 0;
foreach (double value, dataBuffer[name]) {
int y = 256 - value / 2.56 * 256.0;
if (t > 0) {
tempGraphScene->addLine(prev_t, prev_y, t, y, pen);
}
prev_t = t;
prev_y = y;
t++;
}
}
{
QGraphicsScene *tmp = tempGraphScene;
tempGraphScene = graphScene;
graphScene = tmp;
}
ui->graphView->setScene(graphScene);
Ну так вот. Оно лагает. Если убрать отрисовку, оставить только чтение данных и запихивание в QList'ы, то всё хорошо, процессор загружен всего на 5% и всё счастливы. Но с отрисовкой FPS падает раза в 4 и получается очень печально (данные теряются, потому что программа на ПК не успевает их забирать и буфер устройства переполняется). Попробовал выводить данные каждый 100-ый кадр, то есть всего с частотой 1 Гц. В итоге FPS чтения данных получается 96-97. То есть отрисовка настолько тормозная, что за это время успевает потеряться 3-4 кадра данных (буфер устройства способен вместить 32 сэмпла данных со всех каналов, если не успевать их забирать, то он очищается).
Вероятно, я рисую график как быдлокодер. Мне очень стыдно и я хочу узнать как это делать быстро и правильно.