Russian Qt Forum
Ноябрь 26, 2024, 06:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsScene как ускорить отрисовку?  (Прочитано 4438 раз)
qwyllum
Гость
« : Июнь 03, 2013, 19:57 »

Доброго времени суток! Мне необходимо визуализировать карту высот. Существует массив 721*721, в котором хранятся данные. Пробовал каждому элементу сопоставить точку. Т.е. считываю каждое значение массива и добавляю точку определенного цвета на сцену.

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

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

Пока в голову пришло рисовать не каждую точку, а из 4-х делать одну с усредненным значением цвета. Но от этого будет страдать качество. Может кто еще что посоветует?
Записан
_OLEGator_
Гость
« Ответ #1 : Июнь 03, 2013, 20:09 »

Много слов, сути нету.
Как рисуешь на сцене?
Записан
qwyllum
Гость
« Ответ #2 : Июнь 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);

}
Записан
_OLEGator_
Гость
« Ответ #3 : Июнь 03, 2013, 20:28 »

Это ты под каждый пиксель QGraphicsItem выделяешь?!
Конечно будет тормозить.
Ясное дело, генерируй картинку и ее рисуй.
Записан
Dancing_on_water
Гость
« Ответ #4 : Июнь 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();
}
 




Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июнь 16, 2013, 08:40 »

Доброго времени суток! Мне необходимо визуализировать карту высот. Существует массив 721*721, в котором хранятся данные.
Ну и храните его в виде QImage, это детский размер. Нужно отрисовать - делаете др QImage (цвет из значений высоты). При работе с буфером QImage напрямую время отрисовки должно быть намного меньше 0.1 сек
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.149 секунд. Запросов: 22.