жуткие тормоза при отрисовке фона программы (drawImage) |
Здравствуйте, гость ( Вход | Регистрация )
жуткие тормоза при отрисовке фона программы (drawImage) |
Rocky |
5.2.2010, 0:19
Сообщение
#1
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Еще раз всем привет... Вот столкнулся с очередной проблемкой... Есть такой кусок кода
И все. В винде все летает.... скомпилил в линуксе - загрузка цп под 80%. Тормоза просто дикие. Почему так может быть? 2 часа пытался понять что за фигня. У меня KDE со всеми наворотами, compiz все летает просто.. а тут простенькая программа одной функцией по сути убивает все..... Как лучше всего фон программе задать? Единственное что в голову приходит это запихнуть в ремурсы... Утром проверю поможет ли это или нет... Но непонятно почему так тормозит программа из-за этого? _Back.jpg размером 1280х1024.... Весит 300 КБ.... |
|
|
Litkevich Yuriy |
5.2.2010, 0:27
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Единственное что в голову приходит это запихнуть в ремурсы. если картинка загружается в конструкторе класса, то ресурсы не помогут.Вообще такой код как у тебя должен очень быстро работать, может совсем в другом месте проблема. П.С. pEvent->accept(); это лишнее, т.к. попав в обработчик события ты его уже принял. Т.е. isAccepted() = true
|
|
|
Rocky |
5.2.2010, 0:43
Сообщение
#3
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Сделал вот так:
Так все здорово, но эта картинка ставится фоном для вообще всех виджетов, унаследованных от этого.... А можно как-нибудь сделать чтобы только для него (главного окна) это было? Окно наследуется от QMainWindow Цитата это лишнее, т.к. попав в обработчик события ты его уже принял. Т.е. isAccepted() = true Понял, буду иметь ввиду, спасибо. Цитата Вообще такой код как у тебя должен очень быстро работать, может совсем в другом месте проблема. Да нет, вроде как тут. Как только коменнтирую - все ок. Сообщение отредактировал Rocky - 5.2.2010, 0:44 |
|
|
BRE |
5.2.2010, 8:23
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Одна из причин тормозов может быть в том, что не все драйвера сейчас могут ускорять 2D аппаратно.
Вообще, ты выполняешь рисование не оптимально. В событии QPaintEvent, передается регион (область), которую нужно обновить. Вместо этого ты обновляешь все окно. Картинка размером 1280х1024x4 = 5 242 880 байт. При постоянной перерисовке происходит прокачка 5 Мб данных только для фона (без аппаратного ускорения это тяжело). Т.е. вместо перерисовки небольшой области, которая изменилась, ты постоянно перерисовываешь всю сцену. |
|
|
Rocky |
5.2.2010, 9:12
Сообщение
#5
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
А как узнать какая область изменилась? QPaintEvent::region?
Вобщем, со стилями сделал так:
Но картинка не растягивается ни фига.... а просто центруется ( |
|
|
BRE |
5.2.2010, 10:30
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
|
|
|
Rocky |
5.2.2010, 17:50
Сообщение
#7
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
А если попробовать: background-origin: content; Неа, не помогает ( Есть еще background-size, но он не поддерживается QT ща попкопаю в эту сторону Цитата A background-image does not scale with the size of the widget. To provide a "skin" or background that scales along with the widget size, one must you the border-image. Since the border-image property provides an alternate background, it is not required to specify a background-image when border-image is specified. In the case, when both of them are specified, the border-image draws over the background-image. --------------------------------------- да..... сделал так
Картинка растягивается..... но опять тормоза... по-моему еще больше чем при обычной отрисовке в paintEvent ( -------------------------------------- баг что-ли это http://bugreports.qt.nokia.com/browse/QTBU...%3Aall-tabpanel Вероятно придется насоздавать кучу картинок под все разрешения =)... Хотя это жутко по-идиотски ------------------------------------ да и при использовании стилей в линуксе все равно притормаживает ( BRE, если не сложно можно простенький пример как область переисовывать? или просто на словах... ведь картинка получается масштабируемой... т.е. нужно выщитывать координаты картинки с учетом масштабирования, затем что-то типа грабить реальную область изображения, создавать другой QImage и кормить его painter-у? Или не так? Я вот подумал.. а влияет ли на производительность то как собрана qt? Статически или динамически, или включена ли поддкержка opengl? Сообщение отредактировал Rocky - 5.2.2010, 23:14 |
|
|
Rocky |
6.2.2010, 2:40
Сообщение
#8
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Вобщем я все понял.. дело было в реалтзации той отрисовки поверх виджетов о которой говорилось ранее... Завтра попробую скомпилить тот тестовый пример с бабой =) и погонять его тут.
В конченом итоге сделал так:
|
|
|
BRE |
6.2.2010, 8:46
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Заводим буфер для фонового изображения. Его размер будет равен размеру окна. При изменении размеров окна (обработчик resizeEvent), создаем новый буфер и рисуем на нем фоновую картинку. В дальнейшем используем этот буфер в paintEvent для отображения фона. Его размер == размеру окна.
Для этого буфера (да и для любых картинок, которые рисуются на экран) лучше использовать QPixmap, а не QImage. QPixmap оптимизирован для быстрого вывода на экран. |
|
|
Текстовая версия | Сейчас: 1.12.2024, 12:38 |