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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QPainter тормозит при сглаживании!  (Прочитано 16435 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

но когда мы сами создаем QPainterPath это происходит только один раз Улыбающийся
Для одной линии Улыбающийся Если 100 разных линий - мы ничего не экономим. Вот если повторное рисование - есть смысл. Но, как всегда с метафайлом, возни много - хотя бы отследить что изменилось. Поэтому обычно энтузиазма не вызывает.

Интереснее как он делает пресловутое "сглаживание" ?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


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


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

Для одной линии Улыбающийся Если 100 разных линий - мы ничего не экономим.

Почему ? сейчас попробую объяснить как я понял, то что в исходниках нашел, на псевдокоде

вот так
Код:
QPainter painter(this);
for (int i = 0; i < 100; ++i) {
   painter.drawLine(.....);
}

100 раз вызывается рисование drawPath более того в этом случае мы 100 раз создаем QPainterPath, вполне возможно что так и сглаживание будет вызвано 100 раз, но если мы делаем

Код:
QPainter painter(this);
QPainterPath path
for (int i = 0; i < 100; ++i) {
   path.moveTo(...);
   path.lineTo(...);
}

painter.drawPath(path);

то рисование вызывается 1 раз для 100 линий. То есть экономия на лицо ))))
Записан
vregess
Гость
« Ответ #17 : Ноябрь 10, 2012, 22:59 »

ecspertiza, все верно.
Данная процедура, например, значительно ускоряет отрисовку текста.

Можешь по подробнее: Качество текста не страдает? Почему быстрее?
Извините, что вклинился.
Записан
alexman
Гость
« Ответ #18 : Ноябрь 11, 2012, 09:16 »

У всех свое понимание "много линий".
Для отрисовки графиков, например, не обязательно прибегать к использованию OpenGL - это как минимум не разумно и трудозатратно.
Отрисовка кстати еще ускоряется, если рисовать на QGLWidget.
Говоря об OpenGL, подразумевал QGLWidget.
Записан
_OLEGator_
Гость
« Ответ #19 : Ноябрь 11, 2012, 12:41 »

to alexman:
Для меня это было не очевидно, теперь все прояснилось.

to ck:
Качество текста не страдает. Насколько я помню, то при отрисовке текста, он тоже преобразуется в QPainterPath (по сути векторизация текста), а потом отрисовывается.
Надо вспоминать и искать (писать) тесты по этому поводу. Но точно могу сказать, что отрисовка текста под углом производилась быстрее.
Ну и чтобы не быть голословным, сейчас накидаю тестовый проектик.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

но если мы делаем

Код:
QPainter painter(this);
QPainterPath path
for (int i = 0; i < 100; ++i) {
   path.moveTo(...);
   path.lineTo(...);
}

painter.drawPath(path);

то рисование вызывается 1 раз для 100 линий. То есть экономия на лицо ))))
Давайте проверим (аттач). У меня экономия никак не превышает 5%. а у Вас? Да, и, строго говоря, результаты не равны (см строку "check it"). Правда здесь "просто линии", на них экономить не актуально. Вот напр с текстом ситуация может быть другой.
Записан
_OLEGator_
Гость
« Ответ #21 : Ноябрь 11, 2012, 13:14 »

Вот тестовый проект, только при использовании QPainterPath у меня FPS скачет сильно (от 3.5 до 25, 50 и 100), хз почему.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


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


Просмотр профиля
« Ответ #22 : Ноябрь 11, 2012, 13:26 »

Igors, вот мои результаты

Код:
"path = 0, draw time = 0.194. Press a key to redraw" 
"path = -1, draw time = 0.377. Press a key to redraw"
"path = 0, draw time = 0.194. Press a key to redraw"
"path = -1, draw time = 0.388. Press a key to redraw"
"path = 0, draw time = 0.192. Press a key to redraw"
"path = -1, draw time = 0.385. Press a key to redraw"

а вот результаты если добавить сглаживание

Код:
"path = 0, draw time = 0.771. Press a key to redraw" 
"path = -1, draw time = 0.143. Press a key to redraw"
"path = 0, draw time = 0.745. Press a key to redraw"
"path = -1, draw time = 0.141. Press a key to redraw"
"path = 0, draw time = 0.709. Press a key to redraw"
"path = -1, draw time = 0.14. Press a key to redraw"

тоесть на мой взгляд результат на лицо Улыбающийся Пробовл под Mac OS 10.7.4 Qt 4.8.1 как руки до винды доберуться попробую там.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Ага, не все так просто (я смотрел 32-bit, OSX 10.6.8, Qt 4.7.4). А в 64 результаты похожи на Ваши

Цитировать
"path = 0, draw time = 0.277. Press a key to redraw"
"path = 1, draw time = 0.322. Press a key to redraw"
"path = 0, draw time = 0.279. Press a key to redraw"
"path = 1, draw time = 0.307. Press a key to redraw"
"path = 0, draw time = 0.278. Press a key to redraw"
"path = 1, draw time = 0.307. Press a key to redraw"
Т.е прямой вывод чуть быстрее. Однако при вкл сглаживании QPainterPath быстрее в разы

Цитировать
"path = 0, draw time = 0.478. Press a key to redraw"
"path = 1, draw time = 0.082. Press a key to redraw"
"path = 0, draw time = 0.457. Press a key to redraw"
"path = 1, draw time = 0.081. Press a key to redraw"
"path = 0, draw time = 0.453. Press a key to redraw"
"path = 1, draw time = 0.081. Press a key to redraw"

А как он сглаживает? Или пользователем Qt это неинтересно?  Улыбающийся
К сожалению, атрибутов QPainterPath не помнит (аттач)
Записан
vregess
Гость
« Ответ #24 : Ноябрь 11, 2012, 15:10 »

У меня другие результаты.

Без сглаживания.
Код:
"path = 0, draw time = 0.236. Press a key to redraw"
"path = 1, draw time = 0.263. Press a key to redraw"
"path = 0, draw time = 0.26. Press a key to redraw"
"path = 1, draw time = 0.244. Press a key to redraw"
"path = 0, draw time = 0.25. Press a key to redraw"
"path = 1, draw time = 0.252. Press a key to redraw"

Со сглаживанием. painter.setRenderHint(QPainter::Antialiasing,true);
Код:
"path = 0, draw time = 0.562. Press a key to redraw"
"path = 1, draw time = 0.545. Press a key to redraw"
"path = 0, draw time = 0.556. Press a key to redraw"
"path = 1, draw time = 0.565. Press a key to redraw"
"path = 0, draw time = 0.549. Press a key to redraw"
"path = 1, draw time = 0.57. Press a key to redraw"

Win7 x64, qt 4.8.3-x32, msvc 2010
Записан
vregess
Гость
« Ответ #25 : Ноябрь 11, 2012, 15:21 »

Вот тестовый проект, только при использовании QPainterPath у меня FPS скачет сильно (от 3.5 до 25, 50 и 100), хз почему.

Мои результаты.

Код:
QPainter::drawText 3.9 - 4.5
QStaticText        4.2 - 5
QPainterPath       ~1.9
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


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

Думаю это будет не только к линиям относиться, у себя в проекте давно хотел перейти на QPainterPath ,но все руки не доходят, теперь вот и причину весомую нашел, да и удобнее он Улыбающийся Но это уже пожалуй оффтопик.
Если много линий, то и QPainterPath не спасет. OpenGL в этом плане гораздо шустрее.
На машинах, где есть хорошая/мощная видуха.
На встроенных старых лучше не надо...
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
alexman
Гость
« Ответ #27 : Ноябрь 12, 2012, 11:21 »

Думаю это будет не только к линиям относиться, у себя в проекте давно хотел перейти на QPainterPath ,но все руки не доходят, теперь вот и причину весомую нашел, да и удобнее он Улыбающийся Но это уже пожалуй оффтопик.
Если много линий, то и QPainterPath не спасет. OpenGL в этом плане гораздо шустрее.
На машинах, где есть хорошая/мощная видуха.
На встроенных старых лучше не надо...
Ну Вы вспомните еще ламповые машины Подмигивающий
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


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

Думаю это будет не только к линиям относиться, у себя в проекте давно хотел перейти на QPainterPath ,но все руки не доходят, теперь вот и причину весомую нашел, да и удобнее он Улыбающийся Но это уже пожалуй оффтопик.
Если много линий, то и QPainterPath не спасет. OpenGL в этом плане гораздо шустрее.
На машинах, где есть хорошая/мощная видуха.
На встроенных старых лучше не надо...
Ну Вы вспомните еще ламповые машины Подмигивающий
Это объективная реальность для устоявшихся контор, которые работают не один десяток лет.
Наличие парка старых машин. Надо с этим считаться.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


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


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

пошел уже такой оффтопик:) Но я соглашусь с panAlexey, очень в редких случаях для простого рисовани можно использовать OpenGL. Ибо вот к примеру у меня ноут со встроенной видюхой, и если я тот же пример запущу с использованием OpenGL впоне возможно что он будет еще и медленнее работать, просто был такой случай с qml когда для ускорения использовали OpenGL ,но если запускали софт на машинах без нормальной видюхи то софт вис, хотя по сути это ускорение и не нужно было.

А как он сглаживает? Или пользователем Qt это неинтересно?  Улыбающийся

можно глянуть в qpainterengine_x11.cpp например Улыбающийся строка 1739 , я просто в этом не сильно понимаю Улыбающийся
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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