QGraphicsDropShadowEffect загружает процессор во встроенной системе

Я создал виджет, который служит своего рода всплывающим окном и, следовательно, должен иметь тень вокруг, чтобы оптически поднять его над фоном. Я инициализирую эффект тени в конструкторе моего всплывающего виджета следующим образом:

dropshadow = new QGraphicsDropShadowEffect(this);
dropshadow->setBlurRadius(32);
dropshadow->setColor(QColor("#121212"));
dropshadow->setOffset(0,0);
setGraphicsEffect(dropshadow);

Приложение работает на встроенной системе с процессором Intel Atom, пользовательским дистрибутивом Linux, Qt v4.7.3, работающим с сервером qws. Когда я отключаю тень, использование моего процессора составляет менее 10%, когда графический интерфейс не используется. Включение тени увеличивает загрузку процессора более чем на 80%. Профилирование приложения показывает, что большая часть процессорного времени тратится на libQtGui.so.4.7.3.

У кого-нибудь есть идея, почему загрузка процессора так резко возрастает, хотя в графическом интерфейсе абсолютно ничего не происходит, даже движения мыши?

Редактировать. Изменение размера всплывающего окна влияет на степень использования ЦП. Уменьшение размера до четверти снижает использование процессора примерно до четверти. Очень странно.


person arne    schedule 20.09.2011    source источник
comment
Не странно. Вероятно, реализация отбрасываемой тени работает, которая увеличивается с количеством затененных пикселей :) И что вы подразумеваете под холостым ходом? Либо Qt/E постоянно перерисовывает экран, либо что-то вызывает перерисовку, как мне кажется.   -  person Torp    schedule 20.09.2011
comment
Ну, я считаю, что Qt достаточно умен, чтобы не перерисовывать все время, особенно во встроенных системах, пока ничего не меняется, т. Е. Нет движения мыши, нет изменений в видимых виджетах и ​​т. Д. В противном случае загрузка ЦП все время была бы на 100%. , не так ли?   -  person arne    schedule 21.09.2011
comment
В вашем всплывающем окне есть мигающий курсор?   -  person alexisdm    schedule 25.09.2011
comment
Неа. Там только QLabel и пара кнопок. Как я уже сказал, отображение всплывающего окна без тени не требует чрезмерного времени процессора.   -  person arne    schedule 26.09.2011


Ответы (1)


Проблема была только частично с тенью. Кажется, что перерисовка тени требует довольно много процессорного времени — и это нормально, если она не перерисовывается слишком часто. Проблема была проста на самом деле. Виджет, стоящий за этим всплывающим окном, перерисовывался четыре-пять раз в секунду, и, следовательно, всплывающее окно тоже нужно было перерисовывать. Это поглотило огромное количество процессорного времени. Решение такое же простое: избегайте событий перерисовки, если на самом деле ничего не меняется на экране.

person arne    schedule 13.10.2011
comment
К сожалению, тень также вызывает высокую нагрузку на ЦП, если во всплывающем окне что-то закрашивается, например. мигающий курсор. Хотя тень не меняется, она постоянно перерисовывается. - person Ber; 22.01.2014
comment
@Ber: Как жаль. Я не знал и не заметил тогда. - person arne; 22.01.2014