Название: QT 4.3.3 Как заставить QGraphicsScene апдейтить только часть себя? Отправлено: mal от Февраль 21, 2008, 21:12 Ситуация следущая - на сцену добавлен QGraphicsGroupItem, в нем туча объктов наследников QGraphicsPolygonItem. На MouseClick добавляю QGraphicsLineItem и при mouseMove меняю ему координаты от точки нажатия до текущей позиции. Если мыша не забегает на объекты группы сцена апдейтится быстро и линия перерисоовывается также. Как только мыша залазит на объекты груп-айтема - включаются страшные тормоза. Дебаг показал, что сцена перерисовывает все объекты группы на каждый чих. Причем большая часть этих объектов может находится за пределами видимой части окна (изображение увеличено).
Вопрос: как заставить сцену апдейтить только кусок себя, например находящийся под boundingRect lineItem'а ? Или сделать так чтоб она не перерисовывала все item'ы из группы? Пробовал следующее: по левому клику говорю вью (QGraphicsVew) со сценой не апдейтить себя - view->setViewportUpdateMode( QGraphicsView::NoViewportUpdate); , а при движении мыши принудительно апдейтить кусок сцены под айтемом с линией - view->invalidateScene( lineItem.boundingRect()); Однако при таких действиях перерисовки сцены не происходит (по выходу из режима, въюдпортапдейт устанавливаю обратно в QGraphicsView::MinimalViewportUpdate);). Вариант, который сразу отметается: 1. Прорисовать все полигоны в pixmapItem->плюнуть его на сцену. В этом случае все конечно клево и быстро, но при масштабировании будет происходить масштабирование этого пиксмапа вместе со сценой и линии (сплайны в моем случае) выглядят при этом некрасиво. ЗЫ Пока писал вопрос пришла мысль не совать все полигоны в группу, а накидать их прямиком на сцену - возможно в этом случае будут апдейтится только "поврежденные" полигоны. Тем не менее вопрос актуален - как заставить сцену апдейтить только часть себя? Видимую часть себя? Есть мысли? Название: Re: QT 4.3.3 Как заставить QGraphicsScene апдейтить только часть себя? Отправлено: mal от Февраль 26, 2008, 10:54 Еще детализирую:
(исключить объекты из группы и кинуть их прямо на сцену - никакого выигрыша не дало, оно и понятно - группа не есть отдельный графический элемент, а всего лишь контейнер ). Попытаюсь конкретизировать задачу - представим что мы рисуем раскидистый куст. Мои полигоны - это ветки этого куста. способ построения полигонов таков, что кривая ветка может проходить через всю сцену. Далее: плотность веток куста велика. Каждая ветка в моем случае - это отдельный QGraphicsPolygonItem. При добавлении новой ветки, происходит перекрытие какой либо ветки куста (или же n-веток). Bounding rect этой ветки может закрывать большую часть сцены, и соответственно перекрывать другие полигоны, вызывая так же их перерисовку. Таким образом, при отрисовке QGraphicsLineItem от точки нажатия до текущей позиции мыши, происходит каскадная перерисовка сцены и множества ее элементов. И эта добавляемая ветка рисуется с бо-о-льшими задержками. Повторяю вопрос - можно ли сцене назначить какой рект ей можно апдейтить? Иначе придется возвращаться к проверенным методам отрисовки (например как с использованием битовых матриц под виндой - bitblt форева!). Но в этом случае весь графический процесс представления данных мне придется взять на себя. И отказаться от использования на первый взгляд такого мощного инструмента как "Сцена-въю". Что не есть ку. Эксперты - так ку или не ку? Название: Re: QT 4.3.3 Как заставить QGraphicsScene апдейтить только часть себя? Отправлено: vaprele07 от Февраль 26, 2008, 13:53 У него как и у всех виджетов есть методы update, repaint, где можно задать область прорисовки, только зачем это нужно?
SmartViewportUpdate? обычно группа тормозит только при удалении элемента :) Название: Re: QT 4.3.3 Как заставить QGraphicsScene апдейтить только часть себя? Отправлено: mal от Февраль 26, 2008, 19:11 вот кое-что нарыл, есть интересные вещи по ускорению графики, в моем случае помогло (использовал оба пути показанные в ссылке)
кому интересно - ройтесь и юзайте http://thesmithfam.org/blog/2007/02/03/qt-improving-qgraphicsview-performance/ |