Название: Медленно работает drawPixmap. Отправлено: alexman от Апрель 20, 2011, 21:49 1. Есть QGraphicsView. В качестве вьюпорта установлен QGLWidget.
2. Есть наследник от QGraphicsItem c переопределенным методом paint. В связи с багом в Qt реализовал свое кеширование айтема. Примерный код: Код: void paint( QPainter* painter, const QStyleOptionGraphicsItem*, QWidget* = 0 ) Так вот под Windows XP для некоторых моделей NVIDIA-карт медленно работает painter->drawPixmap( 0, 0, _cache ); Проявил следующим образом: открыл notepad и поводил по окну - перерисовка тормозит. Как можно данный косяк оптимизировать? Заранее спасибо! Название: Re: Медленно работает drawPixmap. Отправлено: GreatSnake от Апрель 21, 2011, 08:34 Цитировать В связи с багом в Qt реализовал свое кеширование айтема. Интересно - что за баг?Цитировать Проявил следующим образом: открыл notepad и поводил по окну - перерисовка тормозит. Как можно данный косяк оптимизировать? А разве на QGLWidget backing store не работает?Попробуй вместо QPixmap использовать QImage. Имхо у тебя что-то не так с дизайном, т.к. этот наследник QGraphicsItem завазан на painter->viewport().size(). Для чего вообще это делается? Если для отрисовки подложки, то лучше использовать QGraphicsView::drawBackground(). Название: Re: Медленно работает drawPixmap. Отправлено: alexman от Апрель 21, 2011, 09:06 Цитировать В связи с багом в Qt реализовал свое кеширование айтема. Интересно - что за баг?Цитировать Попробуй вместо QPixmap использовать QImage. Попробую!Цитировать Имхо у тебя что-то не так с дизайном, т.к. этот наследник QGraphicsItem завазан на painter->viewport().size(). Что не так то ??? Есть айтем, у него свой кеш, который меняется, когда текущий view rect изменился. Ну а далее при следующих вызывах рисуется только QPixmap.Для чего вообще это делается? Если для отрисовки подложки, то лучше использовать QGraphicsView::drawBackground(). Название: Re: Медленно работает drawPixmap. Отправлено: GreatSnake от Апрель 21, 2011, 09:10 Как и при каких условиях у тебя задаётся painter->viewport()?
Название: Re: Медленно работает drawPixmap. Отправлено: alexman от Апрель 21, 2011, 09:14 Как и при каких условиях у тебя задаётся painter->viewport()? В смысле? Из Qt Assistant:Код: QRect QPainter::viewport () const Название: Re: Медленно работает drawPixmap. Отправлено: GreatSnake от Апрель 21, 2011, 09:20 Т.е. получается, что размер твоего айтема всегда равен размеру твоего QGraphicsView?
Тогда зачем он вообще нужен? Ведь всё можно отрисовать в QGraphicsView::drawBackground(). Название: Re: Медленно работает drawPixmap. Отправлено: alexman от Апрель 21, 2011, 09:27 Говорил же код примерный! Можно сделать пересечение с boundingRect() и тогда уже размер айтема не будет равен размеру QGraphicsView.
Код: Тогда зачем он вообще нужен? Ведь всё можно отрисовать в QGraphicsView::drawBackground(). Название: Re: Медленно работает drawPixmap. Отправлено: GreatSnake от Апрель 21, 2011, 09:36 Цитировать Можно сделать пересечение с boundingRect() и тогда уже размер айтема не будет равен размеру QGraphicsView. Кстати, а QGraphicsItem::boundingRect() не забыл правильно перегрузить?Цитировать Что даст QGraphicsView::drawBackground()? Отрисовка будет делаться только для clipping region и достаточно быстро, т.к. в этом случае не придётся делать composing.С отрисовкой QGraphicsItem может быть всё намного сложнее. Название: Re: Медленно работает drawPixmap. Отправлено: alexman от Апрель 21, 2011, 09:43 Цитировать Можно сделать пересечение с boundingRect() и тогда уже размер айтема не будет равен размеру QGraphicsView. Кстати, а QGraphicsItem::boundingRect() не забыл правильно перегрузить?Цитировать Что даст QGraphicsView::drawBackground()? Отрисовка будет делаться только для clipping region и достаточно быстро, т.к. в этом случае не придётся делать composing.С отрисовкой QGraphicsItem может быть всё намного сложнее. |