Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: mal от Июль 21, 2010, 13:23



Название: QPixmap - тормоза в иксах
Отправлено: mal от Июль 21, 2010, 13:23
Qt-4.6.2
Юзаю GraphicsViewFramesork.
Столкнулся с такой проблемой:
Портировал проект под линукс и обнаружил, что банальный ресайз сцены, у которой на бэкграунд положен пиксмап приводит к жутким тормозам. Соответственно всякая интерактивная работа с графическими примитивами накладываемыми поверх пиксмапа тоже встает колом. Если же погасить пиксмап, то все начинает летать.
Тема тут уже поднималась про тормоза с примером в иксах из /demos/chip - и она действительно есть!  Как только мы уменьшаем картинку с чипами до момента, когда начинает отрисовываться png  с народом на лужайке - наблюдается тот же эффект с торможением при ресайзе и, например, при скроллинге.
В винде понятно все прекрасно.
Возникает вопрос, что с этим делать в иксах ?   :-\


Название: Re: QPixmap - тормоза в иксах
Отправлено: GreatSnake от Июль 21, 2010, 13:31
Qt это делает отвратительно, поэтому
уберите вашу установку подложки и перегрузите QGraphicsScene::drawBackground():

Код
C++ (Qt)
void YourScene::drawBackground( QPainter* p, const QRectF& clip )
{
if( !bg_image_ )   // QImage* bg_image_ - предварительно загруженная картинка
{
QGraphicsScene::drawBackground( p, clip );
return;
}
 
p->eraseRect( clip );
 
QMatrix wm( p->worldMatrix() );
 
if( wm.m11() != 1 &&
clip.intersects( bg_image_->rect() ) )
{
QImage img;
QRectF c( clip );
if( wm.m11() > 1 )
c.adjust( -1, -1, 1, 1 );
 
qreal cx = c.x();
qreal cy = c.y();
qreal cw = qMax( 16., c.width() );
qreal ch = qMax( 16., c.height() );
 
if( cx < 0 )
{
cw += cx;
cx = 0;
}
if( cy < 0 )
{
ch += cy;
cy = 0;
}
 
cw = qMin( cw, bg_image_->width() - cx );
ch = qMin( ch, bg_image_->height() - cy );
img = bg_image_->copy( QRectF( cx, cy, cw, ch ).toRect() );
cw = qRound( cw * wm.m11() );
ch = qRound( ch * wm.m11() );
img = img.scaled( (int) cw, (int) ch, Qt::IgnoreAspectRatio,
/*wm.m11() > .8 ? Qt::SmoothTransformation :*/ Qt::FastTransformation );
p->setWorldMatrix( QMatrix( 1, 0, 0, 1, wm.dx(), wm.dy() ) );
p->drawImage( QPointF( cx * wm.m11(), cy * wm.m11() ), img );
p->setWorldMatrix( wm );
} else
{
p->drawImage(
QPointF( clip.x(), clip.y() ),
*bg_image_,
QRectF( clip.x(), clip.y(),
qMin( clip.width(), qreal( bg_image_->width() ) ),
qMin( clip.height(), qreal( bg_image_->height() ) ) ) );
}
}
 

Но, т.к. мы отрисовываем только кусок,
нужно будет у QGraphicsView выставить setCacheMode( CacheBackground ),
иначе из-за скейлинга этот кусок не будет "стыковаться" со всей подложкой.


Название: Re: QPixmap - тормоза в иксах
Отправлено: mal от Июль 21, 2010, 14:37
GreatSnake
Спасибо!  :D
Конечно скорость все-таки не такая как в винде, но уже гораздо приемлемей! И примитивы не встают колом.  :D
Теперь брать в руки напильник и пилить код. Ибо много было завязано на пиксмап бросаемый в качестве бэкграунда. Но это уже детали.


Название: Re: QPixmap - тормоза в иксах
Отправлено: SABROG от Июль 21, 2010, 15:32
Тема тут уже поднималась про тормоза с примером в иксах из /demos/chip - и она действительно есть!  Как только мы уменьшаем картинку с чипами до момента, когда начинает отрисовываться png  с народом на лужайке - наблюдается тот же эффект с торможением при ресайзе и, например, при скроллинге.
В винде понятно все прекрасно.
Возникает вопрос, что с этим делать в иксах ?   :-\
У меня одинаково быстро работает и в винде и в линуксе.


Название: Re: QPixmap - тормоза в иксах
Отправлено: mal от Июль 22, 2010, 10:28
Полазил по форумам  - наткнулся на такой костыль - если сделать
view->setViewport(new QGLWidget(QGLFormat(QGL::DoubleBuffer)));
то вроде как все должно стать пучком.
Попробовал на винде - даже в дебаге все заметно ускоряется!  :D
Сейчас пересобереру Qt с поддержкой opengl в линуксе, и тогда проверю, как прога проведет себя в штатном режиме с этим костылем.

*
Нда. Под иксами с этим opengl-ным костылем пиксмап не отображается вообще.  :-\.
Значит напильник и метод GreatSnake'a .

***
Брр - вообщем проверил все под иксами на локальной машине  - все работает! Костыль помог.
То что я написал выше  - я работаю с иксами у себя из под винды через XMing - потому такая шняга. 
Более того, если заходишь с иксовой машины на другую иксовую машину - то наблюдается такой же странный эффект, что вьюха не отображает ничего.
Похоже, что opengl не отрабатывается корректно при работе не на локальной машине. Почему - пока не знаю :-\

ЗЫ Но костыль таки работает!  :D



Название: Re: QPixmap - тормоза в иксах
Отправлено: kamre от Июль 22, 2010, 15:44
наткнулся на такой костыль - если сделать
view->setViewport(new QGLWidget(QGLFormat(QGL::DoubleBuffer)));
то вроде как все должно стать пучком.
Кстати, а почему "костыль"? Это просто включение отрисовки через OpenGL pipeline в Qt.


Название: Re: QPixmap - тормоза в иксах
Отправлено: mal от Июль 22, 2010, 18:17
Пусть не костыль, пусть лекарство.  :)