Название: [SOLVED]Тормозит отрисовка окружностей большого радиуса Отправлено: kamre от Сентябрь 10, 2009, 21:15 Изначально при запуске ничего особо не тормозит, т.е. можно передвигать при нажатой правой кнопке мыши, зумиться по колесику, и все будет плавно.
Но если призумиться на самую маленькую окружность, то все начинает заметно тормозить. Из за чего возникают тормоза? Как от них избавиться? Widget.h: Код: #ifndef WIDGET_H Widget.cpp: Код: #include "widget.h" main.cpp Код: #include <QtGui/QApplication> Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: kamre от Сентябрь 12, 2009, 20:56 Хоть у кого-нибудь проблема с этим кодом воспроизводится?
Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: ufna от Сентябрь 12, 2009, 21:06 ну, так то тут по-моему очевидно, что если ты отсечки никакой не делаешь, то эллипс у тебя рисуется каждый раз во всем объеме. Вот и представь какие у этого всего получаются объемы и размеры.
имхо, стоит сделать отсечку clip region'а, в самую первую очередь (см. demo кутяшное, где еще Артур Плагин юзается). Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: kamre от Сентябрь 12, 2009, 22:57 имхо, стоит сделать отсечку clip region'а, в самую первую очередь (см. demo кутяшное, где еще Артур Плагин юзается). Если добавить clipRect вот так: Код: void Widget::paintEvent(QPaintEvent *event) Какая-то другая "отсечка" имелась ввиду? Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: Igors от Сентябрь 13, 2009, 12:43 Хоть у кого-нибудь проблема с этим кодом воспроизводится? У меня не воспроизводится, никаких тормозов не наблюдаюПримечание: в следующий раз прикрепите zip'чик с файлами чтобы не выдирать их copy/paste Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: pastor от Сентябрь 13, 2009, 12:46 kamre, протестируй Valgrind'ом на предмет потери производительности
Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: kamre от Сентябрь 13, 2009, 13:02 У меня не воспроизводится, никаких тормозов не наблюдаю Нужно призумиться так, чтобы самая маленькая окружность была почти на все окно. После этого появляются тормоза.Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: Igors от Сентябрь 13, 2009, 13:21 Нужно призумиться так, чтобы самая маленькая окружность была почти на все окно. После этого появляются тормоза. Делал, не тормозит (платформа Mac)Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: kamre от Сентябрь 13, 2009, 14:06 Делал, не тормозит (платформа Mac) Я только на Windows/Linux пробовал, и на обоих тормозит.Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: pastor от Сентябрь 13, 2009, 14:56 Я только на Windows/Linux пробовал, и на обоих тормозит. Повторюсь. Глянь профайлером где проблема Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: kamre от Сентябрь 15, 2009, 07:13 Повторюсь. Глянь профайлером где проблема Глянул в Linux с помощью valgrind. Вот такой расклад когда нет зума и не тормозит: (http://pic.ipicture.ru/uploads/090915/X5GC3Scz19.png) А вот так получается, когда зум большой и появляются тормоза: (http://pic.ipicture.ru/uploads/090915/DiRvE5X2Q2.png) Т.е. получается, что проблема возникает при вызове QPainterPath::intersected. И как мне теперь с этим бороться? Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: kamre от Сентябрь 15, 2009, 07:24 Вот, кстати, тот же самый пример на Java. Ничего не тормозит, ни при каком зуме.
Неужели отрисовка в Qt получается тормознее чем в Java2D? Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: Rcus от Сентябрь 15, 2009, 09:17 Интересно... первые 10 минут рассматривания графов и тестов. Очень интересно после пересборки с отладочной версией Qt. И совсем неинтересно после чтения QOutlineMapper::endOutline() (Qt4.5.2 src/gui/painting/qoutlinemapper.cpp line: 257)
Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: kamre от Сентябрь 15, 2009, 09:45 И совсем неинтересно после чтения QOutlineMapper::endOutline() (Qt4.5.2 src/gui/painting/qoutlinemapper.cpp line: 257) Вот такая константа:Код: // This limitations comes from qgrayraster.c. Any higher and А если получается больше по размерам, то делается clip, который ужасно тормозной? И как с этим бороться? Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: Rcus от Сентябрь 15, 2009, 10:00 Ага, а можно назвать специалированным и заточенным под рисование виджетов :). Попробуйте лучше Graphics View Framework.
Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: kamre от Сентябрь 15, 2009, 10:12 Ага, а можно назвать специалированным и заточенным под рисование виджетов :). Ну для растеризации под окошки размеры вроде вполне достаточные )Но тогда не понятно почему при включении отсечения столько много времени начинает тратиться на самом этом отсечении. Ведь наверняка в Java2D не делают растеризацию всей окружности, когда ее радиус огромный, скорее всего только в видимом участке растеризация происходит. Кроме того странно еще то, что судя по второму скриншоту там пересечение кривых безье ищется, хотя по идее для отсечения окружности (эллипса) такого не должно происходить. Попробуйте лучше Graphics View Framework. А чем он здесь поможет? Тем более в нем не поддерживаются cosmetic pens with non zero width:Цитировать QGraphicsItem does not support use of cosmetic pens with a non-zero width. А мне как раз хотелось бы рисовать линии с некоторой постоянной толщиной, не зависящей от уровня зума.Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: Tonal от Сентябрь 15, 2009, 10:22 На Win9x GDI 16-ти разрядный. И вроде на старых Маках.
Так что это, возможно артефакт ещё тех времён. Кроме того, я как-то на Win9x столкнулся с тем, что некоторые функции начинали чудить уже при привышении 4*1024 в значении любой координаты... Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: SABROG от Сентябрь 15, 2009, 10:59 На Win9x GDI 16-ти разрядный. И вроде на старых Маках. Так что это, возможно артефакт ещё тех времён. Кроме того, я как-то на Win9x столкнулся с тем, что некоторые функции начинали чудить уже при привышении 4*1024 в значении любой координаты... Проверил на WinXP, тормозит при scale factor выше ~5k. После этого если зумить дальше и пытаться перетаскивать, то программа просто может зависнуть на несколько секунд. При этом память не кушается. Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: kamre от Сентябрь 15, 2009, 11:05 Проверил на WinXP, тормозит при scale factor выше ~5k. После этого если зумить дальше и пытаться перетаскивать, то программа просто может зависнуть на несколько секунд. При этом память не кушается. Размеры bounding rect для всей конструкции как раз где-то 13x13, т.е. радиуса ~6. При scale factor больше ~5k как раз будет вылезать за указанный выше предел. После этого включается clip и начинаются жуткие тормоза. Как обойти эту проблему не понятно.Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: SABROG от Сентябрь 15, 2009, 12:27 Я немного модифицировал программу таким образом, чтобы сразу видно было в чем проблема. Достаточно двигать правой кнопкой мышки по окну и все лагает. Я приаттачил компилируемый пример.
Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: Winstrol от Сентябрь 15, 2009, 12:47 Можно попытаться включить hardware ускорение, запустив приложение из коммандной строки -graphicssystem opengl
Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: SABROG от Сентябрь 15, 2009, 12:50 Можно попытаться включить hardware ускорение, запустив приложение из коммандной строки -graphicssystem opengl У меня это приводит к тому, что виджет становится белым и ничего не рисуется. А в консоль пишется такое:Код: PB Sample buffers: false Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: kamre от Сентябрь 15, 2009, 13:46 Заметил еще одно различие по сравнению с Java версией. Если после старта распахнуть окно на весь экран (у меня это 1680х1050) и начать активно таскать мышкой с зажатой правой кнопкой,
то Qt загружает полностью одно ядро процессора: (http://pic.ipicture.ru/uploads/090915/y1xxBMy2S7.png) а вот Java не больше 10-12%: (http://pic.ipicture.ru/uploads/090915/E7VY4HTC1X.png) правда памяти Java как всегда отхапала со старта около 30Мб. Это нормальное поведение для Qt при отрисовке на большом widget? Или это можно как-то исправить? Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: pastor от Сентябрь 15, 2009, 14:40 kamre, попробуй на Qt 4.6 TP1 попробовать
Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: kamre от Сентябрь 16, 2009, 17:41 kamre, попробуй на Qt 4.6 TP1 попробовать Обязательно попробую, уже скачал исходники осталось собрать и попробовать. Только скорее всего это не поможет, т.к. судя по исходникам здесь (http://qt.gitorious.org/qt/qt/blobs/4.6/src/gui/painting/qoutlinemapper.cpp#line234) и здесь (http://qt.gitorious.org/qt/qt/blobs/4.6/src/gui/painting/qpathclipper.cpp) в этой версии ничего особо не изменилось.P.S. собралось под win32-msvc2008, никаких отличий нет, т.е. тормозит также. Название: Re: Тормозит отрисовка окружностей большого радиуса Отправлено: kamre от Сентябрь 17, 2009, 10:36 Похоже так просто сразу все рисовать через QPainter не получится в моем случае. Нужно будет самому делать clip под окошко. Например, вот так не тормозит уже ни при каком зуме:
Код
|