Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Вопрос по производительности(эффективности)


Автор: Paspartu 29.9.2008, 02:25
Доброго времени суток! Заморачиваться с таймерами лень... поэтому решил спросить...

Вопрос такой, насколько можно судить о производительности кода при выполнении программы через диспетчер задач Windows?

Дело вот в чем сделал свое окно...

Вариант 1 – делаем совместимый контекст и совместимую картинку для нее с максимальным разрешением монитора у меня получилось 1400х1050, всякий раз при изменении размеров моего окна рисуем по этой картинке функциями GDI, затем перекидываем ее на HDC окна через Bitblt(), я еще раз подчеркну – картинка в памяти рисовалась в памяти каждый раз при наступлении WM_NCPAINT! и перекидывалась полностью (1400х1050) в контекст окна через Bitblt() (за исключением клиентской части, которая вырезалась через SelectClipRgn(), ExcludeClipRect(); Собираем Release сомотрим через диспетчер загрузку ЦП при изменении размеров окна = 15-30% (AMD 2,5 Windows XP).

Ну думаю как то это не по феншую...  smile решил соптимизировать... smile 

Вариант 2 Сделал совместимую картинку размером 200х100, рисую ее один раз при создании окна, еще раз можно акцентировать ваше внимание – картинка рисуется один раз! А при выводе – сделал стандартно – делем ее на 8 частей (4 угла, верх, низ, левая и правая сторана) и по средством BitBlt(),StretchBlt() скидываем ее в контекст окна при наступлении WM_NCPAINT. Все остальное один к одному! (настройки одни и те же и т.д. проект – копия Варианта 1 smile ).  Ну думаю теперь будет летать...  smile  smile 
Собираем Release сомотрим через диспетчер загрузку ЦП при изменении размеров окна = 50-75%!!! т.е. в 2 раза больше!!!  smile  smile  smile  smile  smile 

Не ужели при полной отрисовке (при каждом WM_NCPAINT) + один Bitblt всей картинки тратся меньше времени, чем при рисовании один раз и дроблении на 8 частей? Почему так? Что это так = 100% (если судить по загрузке ЦП). smile 

Автор: mekhanikus 29.9.2008, 12:59
Можно предположить, что много хавает StretchBlt().
Попробуй временно убрать Stretch, и посмотри, что получиться.
А, может и не надо бордюры окна ресайзить так рьяно? Что ты пытаешся в них рисовать?

Автор: Earnest 30.9.2008, 09:32
Есть такое умное слово "Профайлер"...
Несколько лет назад боролась за оптимизацию вывода графики (плюс пересчет координат), там вопрос стоял об инлайн-не инлайн, виртуал-не виртуал и т.д. Убедилась, что как только появлется хоть мало-мальский ГУИ-вызов (даже такой пустяк, казалось бы, как SelectObject) - вся разница между виртуальным, инлайновым и т.д. исчезает на его фоне... Вывод - лучше один "тяжелый" ГУИ-вызов чем 5 "легких".... 
Думаю, что и сейчас ничего не изменилось в этом смысле.

Автор: Paspartu 5.10.2008, 03:27
Earnest, спасибо за разъяснение! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)