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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: График, оптимизация paintEvent  (Прочитано 10770 раз)
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #15 : Март 04, 2016, 18:00 »

Я, честно говоря, надеялся, что кто-нибудь подскажет можно ли  (и если да, то как) засунуть статическое изображени в фон так, чтобы его отрисовка вызывалась только при изменении фона (а не когда в виджите поверх вызывался paintevent). А для отрисовки динамической части графика вызывалась перерисовка только измененной части (что-то вроде void QWidget::update ( const QRect & rect ) ).

Когда вызовется paintevent, то будет перерисовано все, что находится под виджетом, хоть фон, хоть другие виджеты.
Поэтому непонятно, что здесь можно выиграть.
Посмотрите на Qt::WA_NoSystemBackground и Qt::WA_OpaquePaintEvent, может с их помощью что-то улучшится.

Цитировать
Qt::WA_NoSystemBackground   Indicates that the widget has no background, i.e. when the widget receives paint events, the background is not automatically repainted.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Март 04, 2016, 18:13 »

Я, честно говоря, надеялся, что кто-нибудь подскажет можно ли  (и если да, то как) засунуть статическое изображени в фон так, чтобы его отрисовка вызывалась только при изменении фона (а не когда в виджите поверх вызывался paintevent).
А толку? Будет перерисовываться так или иначе, хоть с OpaquePaintEvent хоть нет, разница лишь в каком месте. Да и вывод готового буфера - крохи, на которых не сэкономить.

А для отрисовки динамической части графика вызывалась перерисовка только измененной части (что-то вроде void QWidget::update ( const QRect & rect ) ).
Это в лучшем случае адаптивное рисование которое упоминалось выше.

Вообще надо менять подход. Если клиент не в состоянии купить себе даже приличное железо - то за софт он точно не заплатит. Так чего для него стараться? Вы все добросовестно проверили. Нет возможности сделать быстрее - значит ее нет.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #17 : Март 04, 2016, 20:56 »

Почему не помогает такая схема (вероятно, из-за схемы вызова paintEvent при наложении виджитов)? И какие могут быть мысли по оптимизации (кроме прореживания отрисовки)?  Непонимающий
Проблема скорее всего в том, как вы все рисуете. Вы бы показали, как вы выводите оси и сам график.
Сейчас графики легко прорисовывают старшие модели микроконтроллеров, не говоря уже о дестопах.
« Последнее редактирование: Март 04, 2016, 21:00 от Old » Записан
Bepec
Гость
« Ответ #18 : Март 04, 2016, 22:16 »

А в чём проблема то? вызывайте update с нужными вам координатами и отрисовывайте только обновившуюся область, там все данные для этого есть, в paintEvent.
Но самая закавыка в том, что возможно у вас громоздкое рисование, или плохо оптимизированное. А именно эту часть у вас занимает "/*...*/".

Так что можно только гадать.

PS при приложении тестового проектика я бы поковырялся.
Записан
qaz0
Гость
« Ответ #19 : Март 05, 2016, 19:41 »

Нет возможности сделать быстрее - значит ее нет.
Железо довольно приличное: 520МГц arm. А написанный код практически всегда можно оптимизировать Улыбающийся

Проблема скорее всего в том, как вы все рисуете.
Но самая закавыка в том, что возможно у вас громоздкое рисование, или плохо оптимизированное.
Отрисовка действительно громоздкая, но только в части расчета осей (которая вызывается редко). Реализовано там все на 2 функциях: drawLine и drawText. Плюс определенное количество алгебраических вычислений, чтобы циферки на осях были круглые и текст стоял рядом. В отрисовке самого графика setClipRect для установки границы линий графика, евклидово преобразование точек из физической величины в пиксели на экране и drawLine в цикле. Простейший минимум, без которого не обойтись.

А в чём проблема то? вызывайте update с нужными вам координатами и отрисовывайте только обновившуюся область, там все данные для этого есть, в paintEvent.
Проблема была в непонимании, что именно запихнуть в paintEvent для того, чтобы потом вызывать update или repaint не для всего виджита, а для его части. Ну не совать же туда все расчеты и выводы drawLine+drawText. Ответом оказалось, что туда надо поместить вывод на экран буфера на базе QPixmap, и вызов update/repaint с параметрами зоны перерисовки прекрасно понимает, что не надо рисовать весь виджит заново.


В итоге описанный вызов перерисовки изменил ситуацию полностью - среднее время отрисовки стало меньше в 10 раз. И потратить на расчет+вывод новых значений 5ms как-то совсем не жалко. Резюмируя, вся загвоздка была не в рисовании в буфер - там все оказалось неплохо, а непосредственно в выводе этого буфера на экран.

Благодарю всех отписавшихся.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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