crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в жуткие тормоза при отрисовке фона программы (drawImage)
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
BRE Дата 6.2.2010, 8:46
  Заводим буфер для фонового изображения. Его размер будет равен размеру окна. При изменении размеров окна (обработчик resizeEvent), создаем новый буфер и рисуем на нем фоновую картинку. В дальнейшем используем этот буфер в paintEvent для отображения фона. Его размер == размеру окна.
Для этого буфера (да и для любых картинок, которые рисуются на экран) лучше использовать QPixmap, а не QImage. QPixmap оптимизирован для быстрого вывода на экран.
Rocky Дата 6.2.2010, 2:40
  Вобщем я все понял.. дело было в реалтзации той отрисовки поверх виджетов о которой говорилось ранее... Завтра попробую скомпилить тот тестовый пример с бабой =) и погонять его тут.

В конченом итоге сделал так:
//в конструкторе
    //устанавливаем фон главному окну
    const QString& sBackgroundFileName = qApp->applicationDirPath() + tr("/UI/Background.png");
    const int nWD = QApplication::desktop()->width();
    const int nHD = QApplication::desktop()->height();

    QImage oImage(sBackgroundFileName);
    if (!oImage.isNull())
    {
        if (oImage.size() != QSize(nWD, nHD))
        {
            oImage = oImage.scaled(nWD, nHD);
            oImage.save(sBackgroundFileName);
        }
    }

    qApp->setStyleSheet(QString("QMainWindow { "
        "background-image:url(" + sBackgroundFileName + ");"
        "background-repeat: no-repeat;"
        "background-position: center;"
    "}"
    ));
Rocky Дата 5.2.2010, 17:50
 
Цитата(BRE @ 5.2.2010, 10:30) *
А если попробовать:
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.


---------------------------------------
да..... сделал так
    qApp->setStyleSheet(QString("QMainWindow { "
        "border-image:url(" + qApp->applicationDirPath() + "/UI/_Back.png);"
        "}"
    ));


Картинка растягивается..... но опять тормоза... по-моему еще больше чем при обычной отрисовке в paintEvent (


--------------------------------------
баг что-ли это
http://bugreports.qt.nokia.com/browse/QTBU...%3Aall-tabpanel
Вероятно придется насоздавать кучу картинок под все разрешения =)... Хотя это жутко по-идиотски

------------------------------------
да и при использовании стилей в линуксе все равно притормаживает (

BRE, если не сложно можно простенький пример как область переисовывать? или просто на словах... ведь картинка получается масштабируемой... т.е. нужно выщитывать координаты картинки с учетом масштабирования, затем что-то типа грабить реальную область изображения, создавать другой QImage и кормить его painter-у? Или не так?


Я вот подумал.. а влияет ли на производительность то как собрана qt? Статически или динамически, или включена ли поддкержка opengl?
BRE Дата 5.2.2010, 10:30
 
Цитата(Rocky @ 5.2.2010, 9:12) *
А как узнать какая область изменилась? QPaintEvent::region?

Да - это регион, а прямоугольная область - QPaintEvent::rect ().

Цитата(Rocky @ 5.2.2010, 9:12) *
Но картинка не растягивается ни фига.... а просто центруется (

А если попробовать:
background-origin: content;
Rocky Дата 5.2.2010, 9:12
  А как узнать какая область изменилась? QPaintEvent::region?

Вобщем, со стилями сделал так:
qApp->setStyleSheet(QString("QMainWindow { "
        "background-image:url(" + GetApplicationDirPath() + "/UI/_Back.png);"
        "background-repeat:no-repeat;"
        "background-position:center;}"
    ));


Но картинка не растягивается ни фига.... а просто центруется (
BRE Дата 5.2.2010, 8:23
  Одна из причин тормозов может быть в том, что не все драйвера сейчас могут ускорять 2D аппаратно.
Вообще, ты выполняешь рисование не оптимально. В событии QPaintEvent, передается регион (область), которую нужно обновить. Вместо этого ты обновляешь все окно. Картинка размером 1280х1024x4 = 5 242 880 байт. При постоянной перерисовке происходит прокачка 5 Мб данных только для фона (без аппаратного ускорения это тяжело).
Т.е. вместо перерисовки небольшой области, которая изменилась, ты постоянно перерисовываешь всю сцену.
Rocky Дата 5.2.2010, 0:43
  Сделал вот так:
this->setStyleSheet(QString("background-image:url(" + GetApplicationDirPath() + "/UI/_Back.jpg)"));

Так все здорово, но эта картинка ставится фоном для вообще всех виджетов, унаследованных от этого.... А можно как-нибудь сделать чтобы только для него (главного окна) это было? Окно наследуется от QMainWindow


Цитата
это лишнее, т.к. попав в обработчик события ты его уже принял. Т.е. isAccepted() = true

Понял, буду иметь ввиду, спасибо.

Цитата
Вообще такой код как у тебя должен очень быстро работать, может совсем в другом месте проблема.

Да нет, вроде как тут. Как только коменнтирую - все ок.
Litkevich Yuriy Дата 5.2.2010, 0:27
 
Цитата(Rocky @ 5.2.2010, 3:19) *
Единственное что в голову приходит это запихнуть в ремурсы.
если картинка загружается в конструкторе класса, то ресурсы не помогут.
Вообще такой код как у тебя должен очень быстро работать, может совсем в другом месте проблема.

П.С.
Цитата(Rocky @ 5.2.2010, 3:19) *
pEvent->accept();
это лишнее, т.к. попав в обработчик события ты его уже принял. Т.е. isAccepted() = true
Rocky Дата 5.2.2010, 0:19
  Еще раз всем привет... Вот столкнулся с очередной проблемкой... Есть такой кусок кода
//в конструкторе класса
m_oBackgroundImage = QImage(GetApplicationDirPath() + "/UI/_Back.jpg");

//далее отрисовка
void CStationClient::paintEvent(QPaintEvent *pEvent)
{
    QPainter oPainter(this);
    oPainter.drawImage(this->rect(), m_oBackgroundImage);
    pEvent->accept();
}

И все. В винде все летает.... скомпилил в линуксе - загрузка цп под 80%. Тормоза просто дикие. Почему так может быть? 2 часа пытался понять что за фигня. У меня KDE со всеми наворотами, compiz все летает просто.. а тут простенькая программа одной функцией по сути убивает все..... Как лучше всего фон программе задать? Единственное что в голову приходит это запихнуть в ремурсы... Утром проверю поможет ли это или нет... Но непонятно почему так тормозит программа из-за этого? _Back.jpg размером 1280х1024.... Весит 300 КБ....
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 13:11