Russian Qt Forum

Qt => Вопросы новичков => Тема начата: qwyllum от Июнь 03, 2013, 19:57



Название: QGraphicsScene как ускорить отрисовку?
Отправлено: qwyllum от Июнь 03, 2013, 19:57
Доброго времени суток! Мне необходимо визуализировать карту высот. Существует массив 721*721, в котором хранятся данные. Пробовал каждому элементу сопоставить точку. Т.е. считываю каждое значение массива и добавляю точку определенного цвета на сцену.

Изображение визулизируется около 20 секунд. Стоит задача оптимизации этого всего чуда

Сперва подумал в сторону генерирования в изображение. Но вряд ли рисование на буфере рисунка будет сильно быстрее рисования на экранном буфере. Может у кого есть идеи?

Пока в голову пришло рисовать не каждую точку, а из 4-х делать одну с усредненным значением цвета. Но от этого будет страдать качество. Может кто еще что посоветует?


Название: Re: QGraphicsScene как ускорить отрисовку?
Отправлено: _OLEGator_ от Июнь 03, 2013, 20:09
Много слов, сути нету.
Как рисуешь на сцене?


Название: Re: QGraphicsScene как ускорить отрисовку?
Отправлено: qwyllum от Июнь 03, 2013, 20:24
Код:
scene.addItem(new Plot(x,y, color));

class Plot: public QGraphicsItem

void Plot::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{

    painter->setPen(QPen(color));

        painter->drawPoint(x,y);

}


Название: Re: QGraphicsScene как ускорить отрисовку?
Отправлено: _OLEGator_ от Июнь 03, 2013, 20:28
Это ты под каждый пиксель QGraphicsItem выделяешь?!
Конечно будет тормозить.
Ясное дело, генерируй картинку и ее рисуй.


Название: Re: QGraphicsScene как ускорить отрисовку?
Отправлено: Dancing_on_water от Июнь 15, 2013, 20:49
Ну, строго говоря, совет неверный.

В чем проблема: вы создали массив из 721*721 item-ов, но помните, что сцена их не просто рисует, но проиндексировала. И каждый чих она пытается понять как элементы взаимодействуют и т.п.

Итак, во-первых это не разные объекты, а один и нам следует его выдавать одним куском

Этап номер 1.

Вычисляем массив отображаемых точек и кэшируем его и рисуем скопом:

Код
C++ (Qt)
void Plot::setData(QVector<QPointF> data)
{
 m_data = data;
}
 
void Plot::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->drawPoints(m_data.data(), m_data.size());
}

Этап 2 Если скорость отрисовки неустраивает допиливаем:

Код
C++ (Qt)
graphicsView.setViewPort(new QGlWidegt());

Этап 3. Если снова не устраивает, то переделываем:
Код
C++ (Qt)
void Plot::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->beginNativePainting();
//draw points by OpenGL
painter->endNativePaintin();
}
 






Название: Re: QGraphicsScene как ускорить отрисовку?
Отправлено: Igors от Июнь 16, 2013, 08:40
Доброго времени суток! Мне необходимо визуализировать карту высот. Существует массив 721*721, в котором хранятся данные.
Ну и храните его в виде QImage, это детский размер. Нужно отрисовать - делаете др QImage (цвет из значений высоты). При работе с буфером QImage напрямую время отрисовки должно быть намного меньше 0.1 сек