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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QPainter тормозит при сглаживании!  (Прочитано 16512 раз)
yarick
Гость
« : Ноябрь 09, 2012, 15:04 »

Рисую 100 простых линий в небольшом экране - и наблюдаю тормоза... Задача-то простейшая, если все виджеты QT рисуются через пейнт, то почему рисование простой линии так тормозит?

Код:
#include <QtGui>

class MyClass : public QWidget{
public:
  MyClass(){

  }
  void paintEvent(QPaintEvent* event)
  {
    int i=0;

    QTime time;
    time.start();

    for(i=0;i<100;i++){
        QPainter p(this);
        p.setRenderHint(QPainter::Antialiasing,true);
        p.setPen(QPen(Qt::blue,2,Qt::SolidLine));
        p.drawLine(0,0,640,480);
        p.end();
      }

    qDebug()<<"paint"<< " mc = " <<time.elapsed();
  }
};

int main(int argc, char* argv[]){
  QApplication app(argc, argv);

  MyClass* myClass = new MyClass();

  myClass->resize(640,480);
  myClass->show();

  return app.exec();
}

Со сглаживанием (в дебаг режиме) - выполняется 25-30 мс, без него 3-5 мс (что также не приемлимо для 100 простых линий). Комп у меня мощный, но в проекте тормоза заметны, т.к. там я часто с перерисовкой работаю....
В релиз-режиме быстрее, но не значительно
Записан
_OLEGator_
Гость
« Ответ #1 : Ноябрь 09, 2012, 15:05 »

Ну как минимум QPainter и всю приблуду надо вынести из цикла, оставив в нем только drawLine.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Ноябрь 09, 2012, 16:51 »

+ возможно поможет QPainterPath сначала добавить в него все что нужно ,а потом уже нарисовать все это дело.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #3 : Ноябрь 09, 2012, 17:00 »

Преобразовал ваш пример вот так

Код:
    QTime time;
    time.start();

    QPainter p(this);
    p.setRenderHint(QPainter::Antialiasing,true);
    p.setPen(QPen(Qt::blue,2,Qt::SolidLine));

    QPainterPath path;

    for(int i=0;i<100;i++){
        path.moveTo(0,0);
        path.lineTo(640,480);
     }

    p.drawPath(path);
    p.end();

    qDebug()<< "paint"<< " mc = " <<time.elapsed();

выполняется 1-2 мс против того что было с вашим примером 40 - 60мс  Улыбающийся
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Ноябрь 09, 2012, 21:43 »

Уберете сглаживание будет меньше тормозить Улыбающийся
Записан

ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #5 : Ноябрь 09, 2012, 23:16 »

А если сглаживание нужно оставить ? Улыбающийся Просто сглаживание будет отрабатывать для каждого вызова drawLine поэтому лучше использовать drawPath тогда сглаживание отработает всего один раз  Улыбающийся
Записан
yarick
Гость
« Ответ #6 : Ноябрь 10, 2012, 13:07 »

Ну как минимум QPainter и всю приблуду надо вынести из цикла, оставив в нем только drawLine.
Цикл сделан ради примера - чтобы измерить время и сравнить. В реальной программе будет рисоваться много разных линий (около 5-10) и перерисовываться около 100 раз в секунду.

А на счёт path - это действительно хорошая идея, спасибо

Что касается сглаживания - без него никак - программа будет выглядеть слишком некрасиво. И про неё кое кто скажет - "Так верстают только ******"
Записан
_OLEGator_
Гость
« Ответ #7 : Ноябрь 10, 2012, 14:11 »

"Цикл сделан ради примера" - отличный ответ!
Ему указали на ошибку и возможную проблему в коде, а он еще и сопротивляется...
5-10 линий - это ничто.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Ноябрь 10, 2012, 14:38 »

В реальной программе будет рисоваться много разных линий (около 5-10) и перерисовываться около 100 раз в секунду.
И что, на каждой операции рисования заряжать painter ?  Улыбающийся

+ возможно поможет QPainterPath сначала добавить в него все что нужно ,а потом уже нарисовать все это дело.
А каким образом он ускорит рисование и "сглаживание"? Я так понимаю что это просто метафайл, т.е. что рисовать он знает - но сам-то не рисует. Или как?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #9 : Ноябрь 10, 2012, 19:44 »

Да, по сути QPainterPath хранит в себе информацию того что нужно нарисовать. Теперь по поводу того почему он работает быстрее, посмотрел код Qt и вот что увидел: Когда мы вызываем код drawLine(блаблабла), внутри QPainter вызывается код для рисования нескольких линий drawLines(&l,1) - &l видимо ссылка на координаты, 1 - индекс линии, это несколько странно на мой взгляд ибо я бы сделал наоборот из drawLines вызывал drawLine, ну да ладно это не суть. Смотрю дальше и вижу что drawLines в случае использования сглаживания вызывает создание ,что бы вы думали QPainterPath и уже затем вызов drawPath Улыбающийся Тоесть получается следуещее - когда мы 100 раз рисуем линии мы на самом деле 100 раз создаем QPainterPath и его отрисовываем со всякими сглаживаниями и прочим, но когда мы сами создаем QPainterPath это происходит только один раз Улыбающийся
Записан
_OLEGator_
Гость
« Ответ #10 : Ноябрь 10, 2012, 19:59 »

ecspertiza, все верно.
Данная процедура, например, значительно ускоряет отрисовку текста.
Записан
alexman
Гость
« Ответ #11 : Ноябрь 10, 2012, 19:59 »

Споры излишне. QPainter медленно рисует линии любым способом:(
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #12 : Ноябрь 10, 2012, 20:01 »

Думаю это будет не только к линиям относиться, у себя в проекте давно хотел перейти на QPainterPath ,но все руки не доходят, теперь вот и причину весомую нашел, да и удобнее он Улыбающийся Но это уже пожалуй оффтопик.
Записан
alexman
Гость
« Ответ #13 : Ноябрь 10, 2012, 20:04 »

Думаю это будет не только к линиям относиться, у себя в проекте давно хотел перейти на QPainterPath ,но все руки не доходят, теперь вот и причину весомую нашел, да и удобнее он Улыбающийся Но это уже пожалуй оффтопик.
Если много линий, то и QPainterPath не спасет. OpenGL в этом плане гораздо шустрее.
Записан
_OLEGator_
Гость
« Ответ #14 : Ноябрь 10, 2012, 20:23 »

У всех свое понимание "много линий".
Для отрисовки графиков, например, не обязательно прибегать к использованию OpenGL - это как минимум не разумно и трудозатратно.
Отрисовка кстати еще ускоряется, если рисовать на QGLWidget.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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