Создается впечатление что вывод графики в 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.
Здравствуйте, Аноним, Вы писали:
А>...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>Как проводили измерения?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, A13x, Вы писали:
A>>Здравствуйте, Аноним, Вы писали:
А>>>...QPainter::drawRect работает примерно раз в 50 медленее чем вызов Win API функции Rectangle...
A>>а пример можно в котором видны такие цифры? A>>Как проводили измерения?
А>Примерно так А>
Здравствуйте, Аноним, Вы писали:
А>Создается впечатление что вывод графики в 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
Приветствую, alexei_s, вы писали:
a> Как самый радикальный путь оптимизации — написание своего pain engine, который бы рисовал с пом. gdi функций напрямую на канвасе.
Чтото мне кажется что кроссплатформенность в таком случае разворачивается и уходит в закат...
a>> Как самый радикальный путь оптимизации — написание своего pain engine, который бы рисовал с пом. gdi функций напрямую на канвасе. S>Чтото мне кажется что кроссплатформенность в таком случае разворачивается и уходит в закат...
Реализовать именно painter для винды, а на линуксе использовать родной. Там, по иднн, надо просто интерфейс выставить наружу соответствующий, и подменять на свой.
Здравствуйте, Аноним, Вы писали:
А>Создается впечатление что вывод графики в Qt очень медленный. Для примера (не знаю насколько правильно я измерял) функция QPainter::drawRect работает примерно раз в 50 медленее чем вызов Win API функции Rectangle. Если кто сталкивался подскажите почему это происходит и возможные пути оптимизации?
Приветствую, wtom, вы писали:
w> Qt, насколько я знаю, заточено на OpenGL. Иначе медленно.
емнип для того чтобы пользовать опенгл надо рисовать на QGLWidget
Здравствуйте, 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 я лично слабо представляю...