Qt QPainter MS Windows
От: Аноним  
Дата: 23.12.09 15:14
Оценка:
Создается впечатление что вывод графики в Qt очень медленный. Для примера (не знаю насколько правильно я измерял) функция QPainter::drawRect работает примерно раз в 50 медленее чем вызов Win API функции Rectangle. Если кто сталкивался подскажите почему это происходит и возможные пути оптимизации?

21.01.10 02:03: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: Qt QPainter MS Windows
От: Аноним  
Дата: 23.12.09 15:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Создается впечатление что вывод графики в Qt очень медленный. Для примера (не знаю насколько правильно я измерял) функция QPainter::drawRect работает примерно раз в 50 медленее чем вызов Win API функции Rectangle. Если кто сталкивался подскажите почему это происходит и возможные пути оптимизации?


использовать WTL?
Re[2]: Qt QPainter MS Windows
От: Аноним  
Дата: 23.12.09 15:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Создается впечатление что вывод графики в Qt очень медленный. Для примера (не знаю насколько правильно я измерял) функция QPainter::drawRect работает примерно раз в 50 медленее чем вызов Win API функции Rectangle. Если кто сталкивался подскажите почему это происходит и возможные пути оптимизации?


А>использовать WTL?


Дело не в этом, используется Qt. Хотелось бы понять почему это медленно работает. Тем более это планируется портирровать на Linux.
Re[3]: Qt QPainter MS Windows
От: A13x США  
Дата: 23.12.09 16:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>...QPainter::drawRect работает примерно раз в 50 медленее чем вызов Win API функции Rectangle...


а пример можно в котором видны такие цифры?
Как проводили измерения?
Re[4]: Qt QPainter MS Windows
От: Аноним  
Дата: 23.12.09 17:06
Оценка:
Здравствуйте, A13x, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>...QPainter::drawRect работает примерно раз в 50 медленее чем вызов Win API функции Rectangle...


A>а пример можно в котором видны такие цифры?

A>Как проводили измерения?

Примерно так
QPainter p;
QRecr rect;
...
p.drawRect(rect);
::Rectangle(p.device()->getDC(), rect.left(), rect.top(), rect.right(), rect.bottom());

Измерение при помощи QueryPerformanceCounter
Re[5]: Qt QPainter MS Windows
От: Sheridan Россия  
Дата: 23.12.09 17:59
Оценка:
Приветствую, Анонимус, вы писали:

> Примерно так

>
> QPainter p;
> QRecr rect;
> ...
> p.drawRect(rect);
> ::Rectangle(p.device()->getDC(), rect.left(), rect.top(), rect.right(), rect.bottom());

>

Странный код... Что и на чем рисуете? Задача вообще какая?
avalon 1.0rc3 rev 306, zlib 1.2.3 (17.12.2009 01:06:14 MSK +03:00)(Qt 4.6.0)
Matrix has you...
Re[5]: Qt QPainter MS Windows
От: Аноним  
Дата: 23.12.09 18:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, A13x, Вы писали:


A>>Здравствуйте, Аноним, Вы писали:


А>>>...QPainter::drawRect работает примерно раз в 50 медленее чем вызов Win API функции Rectangle...


A>>а пример можно в котором видны такие цифры?

A>>Как проводили измерения?

А>Примерно так

А>
А>QPainter p;
А>QRecr rect;
А>...
А>p.drawRect(rect);
А>::Rectangle(p.device()->getDC(), rect.left(), rect.top(), rect.right(), rect.bottom());

А>

А>Измерение при помощи QueryPerformanceCounter

OpenGL используется?
Re: Qt QPainter MS Windows
От: alexei_s  
Дата: 23.12.09 19:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Создается впечатление что вывод графики в Qt очень медленный. Для примера (не знаю насколько правильно я измерял) функция QPainter::drawRect работает примерно раз в 50 медленее чем вызов Win API функции Rectangle. Если кто сталкивался подскажите почему это происходит и возможные пути оптимизации?


Происходит это потому, что Qt использует софтверную растеризацию. Она рисует примитивы (линии, шрифты и т.п.)не с помощью функций gdi, а сама, в памяти (на битмапе). Только потом, она целиком блитает отрисованный битмап (например с каким-нить виджетом) на канвас.

Это основная причина тормозов.

Вообще, за низкоуровневое рисование в куте отвечает paint engine (интерфейсный класс). Есть его несколько разновидностей — основанные на open gl, direct x
В 4.6 движком по-умолчанию стал open gl — и вроде как немного ускорилось, но это с лихвой компенсируется его глюкавостью
DirectX движек вырезали вообще.


Как самый радикальный путь оптимизации — написание своего pain engine, который бы рисовал с пом. gdi функций напрямую на канвасе.
Или детальное разбирательство и допиливание open gl движка.

В любом случае — профилировка, и поиск узких мест отрисовки в конкретном приложении, а не в вакууме.
Т.е. возможно достаточно будет оптимизнуть отрисовку конкретного компонента. Нам, например, удалось значительно оптимизировать алгоритмы отрисовки кутешных гридов, без влезания в pain engine
Re[6]: Qt QPainter MS Windows
От: Sheridan Россия  
Дата: 23.12.09 19:53
Оценка:
Приветствую, Анонимус, вы писали:
> OpenGL используется?
Нет, не будет там опенгл.
avalon 1.0rc3 rev 306, zlib 1.2.3 (17.12.2009 01:06:14 MSK +03:00)(Qt 4.6.0)
Matrix has you...
Re[2]: Qt QPainter MS Windows
От: Sheridan Россия  
Дата: 23.12.09 20:10
Оценка:
Приветствую, alexei_s, вы писали:

a> Как самый радикальный путь оптимизации — написание своего pain engine, который бы рисовал с пом. gdi функций напрямую на канвасе.

Чтото мне кажется что кроссплатформенность в таком случае разворачивается и уходит в закат...
avalon 1.0rc3 rev 306, zlib 1.2.3 (17.12.2009 01:06:14 MSK +03:00)(Qt 4.6.0)
Matrix has you...
Re[7]: Qt QPainter MS Windows
От: wtom  
Дата: 23.12.09 22:49
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Приветствую, Анонимус, вы писали:

>> OpenGL используется?
S>Нет, не будет там опенгл.

Qt, насколько я знаю, заточено на OpenGL. Иначе медленно.
Не стоит переходить реку вброд, если известно только, что ее глубина (средняя) 4 фута.
Re[3]: Qt QPainter MS Windows
От: Mamut Швеция http://dmitriid.com
Дата: 24.12.09 08:43
Оценка:
a>> Как самый радикальный путь оптимизации — написание своего pain engine, который бы рисовал с пом. gdi функций напрямую на канвасе.
S>Чтото мне кажется что кроссплатформенность в таком случае разворачивается и уходит в закат...

Реализовать именно painter для винды, а на линуксе использовать родной. Там, по иднн, надо просто интерфейс выставить наружу соответствующий, и подменять на свой.

Стоит ли овчинка выделки — хз


dmitriid.comGitHubLinkedIn
Re[5]: Qt QPainter MS Windows
От: K13 http://akvis.com
Дата: 24.12.09 13:34
Оценка:
А>Примерно так
А>
А>QPainter p;
А>QRecr rect;
А>...
А>p.drawRect(rect);
А>::Rectangle(p.device()->getDC(), rect.left(), rect.top(), rect.right(), rect.bottom());

А>

А>Измерение при помощи QueryPerformanceCounter

Попробовать рисовать не по 1 прямоугольнику, а по тысяче в цикле? соотношение сохраняется?
Re[3]: Qt QPainter MS Windows
От: alexei_s  
Дата: 24.12.09 16:44
Оценка:
Конечно, но в названии темы фигурирует windows, так что наверное автора интересует именно данная ос
Re: Qt QPainter MS Windows
От: Zhendos  
Дата: 24.12.09 17:48
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Создается впечатление что вывод графики в Qt очень медленный. Для примера (не знаю насколько правильно я измерял) функция QPainter::drawRect работает примерно раз в 50 медленее чем вызов Win API функции Rectangle. Если кто сталкивался подскажите почему это происходит и возможные пути оптимизации?


http://labs.trolltech.com/blogs/2009/12/18/qt-graphics-and-performance-the-raster-engine/

там есть несколько советов по оптимизации от тролей.
Re[8]: Qt QPainter MS Windows
От: Sheridan Россия  
Дата: 24.12.09 18:10
Оценка:
Приветствую, wtom, вы писали:

w> Qt, насколько я знаю, заточено на OpenGL. Иначе медленно.

емнип для того чтобы пользовать опенгл надо рисовать на QGLWidget
avalon 1.0rc3 rev 306, zlib 1.2.3 (17.12.2009 01:06:14 MSK +03:00)(Qt 4.6.0)
Matrix has you...
Re[2]: Qt QPainter MS Windows
От: trdm Россия  
Дата: 25.01.10 08:17
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, Аноним, Вы писали:


А>>Создается впечатление что вывод графики в Qt очень медленный. Для примера (не знаю насколько правильно я измерял) функция QPainter::drawRect работает примерно раз в 50 медленее чем вызов Win API функции Rectangle. Если кто сталкивался подскажите почему это происходит и возможные пути оптимизации?


Z>http://labs.trolltech.com/blogs/2009/12/18/qt-graphics-and-performance-the-raster-engine/


Z>там есть несколько советов по оптимизации от тролей.

ага, это появилось после этой дискуссии:
http://www.prog.org.ru/topic_11868_0.html
Заценить разницу в скорости рисования можно в этом проектике: http://unnstudioreport.googlecode.com/files/Test5.zip
На винде допустим это еще можно как-то побороть с использованием Win API с ограничением: если паинтер инициализирован
контекстом виджета, если инициализирован пиксмапом, то не поможет Win API.
а вот чего делать на Linux я лично слабо представляю...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.