Ускорение 2D-рисования

Я пытаюсь сделать 2D-сюжет в реальном времени. Я попытался изменить пример осциллографа qwt, попытался использовать QGraphicsView и QPainter для достижения высокой частоты кадров. Я использую 8 каналов для построения данных, поступающих с порта rs232. Я беру образец каждые 10 мс. Возможно, я неправильно использовал QPainter, но я не мог рисовать очень быстро. В примере с qwt, в котором не обновляется весь экран, скорость отрисовки была хорошей, особенно в X11 с Qt::WA_PaintOutsidePaintEvent и Qt::WA_PaintOnScreen.

Теперь я подклассифицирую QGLWidget и достиг приемлемой скорости. Но мне интересно, могу ли я улучшить его.

Каждый раз, когда я получал новую точку, я сохранял ее, а вызов updateGL(); В этом случае я получил только координату y, но я собираюсь получить всю пару.

void Plot::addPoint(int y)
{
   points[t].x=t;
   points[t].y=y;
   t++;
   updateGL();
}

В DrawGL() я проверяю, достигает ли линия конца экрана, если это правда, я стираю экран, если нет, я рисую только новую часть линии.

  glBegin(GL_LINES);
    glVertex2i( points[t-1].x, points[t-1].y);
    glVertex2i( points[t-2].x, points[t-2].y);
 glEnd();

Я отключил дизеринг и мультисэмплинг и использую плоские оттенки. я использую ортографическую проекцию.

есть ли способ рисовать быстрее? может быть, используя opengl для рисования вне экрана и показа соответствующего растрового изображения? проект похож на этот?


person Luciano Lorenti    schedule 12.11.2009    source источник


Ответы (1)


В этом могут помочь объекты буфера вершин (и, возможно, списки отображения). По сути, вам нужен способ уменьшить количество вызовов GL, которые вы делаете, и это будет быстро.

person Jay Kominek    schedule 12.11.2009
comment
я только что попробовал использовать массив вершин, и это немного быстрее. Теперь я собираюсь взглянуть на отображение списков и VBO (это сложная вещь, не так ли?) - person Luciano Lorenti; 12.11.2009
comment
Да, они не такие простые, как сейчас. Кроме того, мне приходит в голову, что вы, вероятно, должны просто рассматривать массив точек как круговой буфер и перерисовывать его целиком каждый раз, когда вызывается DrawGL. Это сделает его максимально простым и должно выглядеть идентично. (вероятно, даже лучше, вы будете меньше мерцать в правой части экрана.) - person Jay Kominek; 12.11.2009
comment
Я попытался очистить всю сцену и перерисовать всю сцену в каждом рисовании, но это очень медленно. Но, я не знаю, я перерисовываю 8 виджетов, по крайней мере, по 800 точек каждый. Dublebuffering усугубляет ситуацию. Я точно что-то не так делаю. С SingleBuffer и отрисовкой только последней части кривой я получаю полуприемлемую скорость: S, может быть, сделать 1 виджет с 8 строками? - person Luciano Lorenti; 12.11.2009