Russian Qt Forum
Октябрь 01, 2024, 10:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QGraphicsView и QGraphicsItem::update оптимизация  (Прочитано 15475 раз)
BRE
Гость
« Ответ #15 : Март 10, 2009, 22:53 »

Вот создал что-то похожее на основе chip из примеров qt. Грузит проц на 100 процентов. Может ли быть что проблема в graphicsView->items(b_rect)?
IMHO слот updateVisibleItems() выполняется за время более чем 100 мс. Т.е. сработал таймер, запустился слот обновления, отработал и таймер его тут же запустил вновь.
update() выполняется для всех итемов, а не только для видимых.
Программа делает ровно то что написано.
Записан
sh123
Гость
« Ответ #16 : Март 11, 2009, 00:19 »

Также добавил второй немного изменённый пример в котором вместо текста просто отображается 20000 прямоугольников, причём все текущие видимые элементы кэшируются, так что graphicsView->items не вызывается. Данный пример стабильно грузит проц на 90-100 процентов.

Записан
sh123
Гость
« Ответ #17 : Март 11, 2009, 00:25 »

Вот создал что-то похожее на основе chip из примеров qt. Грузит проц на 100 процентов. Может ли быть что проблема в graphicsView->items(b_rect)?
IMHO слот updateVisibleItems() выполняется за время более чем 100 мс. Т.е. сработал таймер, запустился слот обновления, отработал и таймер его тут же запустил вновь.
update() выполняется для всех итемов, а не только для видимых.
Программа делает ровно то что написано.

Так в этом то и проблема, что 100 миллисекунд недостаточно чтобы обновить видимые элементы или нет? У меня ~10 видимых квадратов (закэшеных во втором примере) и я говорю кути, чтобы она их обновила и просто чтобы обновить их у кути уходит больше 100 миллисекунд, что очень много или я чего-то не понимаю? Добавлю лишь, что возможно мне нужен аналог QWidget::repaint() для итемов, так как они не меняют своего положения и размера, необходимо просто перерисовать те 10 видимых элементов находящихся в текущем viewport.


« Последнее редактирование: Март 11, 2009, 10:50 от sh123 » Записан
BRE
Гость
« Ответ #18 : Март 11, 2009, 11:41 »

Добавь в настройку QGraphicsView еще эти строки:
Код
C++ (Qt)
view->setOptimizationFlags( QGraphicsView::DontClipPainter  | QGraphicsView::DontSavePainterState | QGraphicsView::DontAdjustForAntialiasing );
view->setViewportUpdateMode( QGraphicsView::BoundingRectViewportUpdate );
 
Qt очень многое берет на себя, возможно часть функционала тебе не нужна - выключи.
Не забывай, что вся отрисовка проходит через матрицы трансформаций.
Также имеет большое значение, суммарный объем области обновления, т.е. если будет обновляться один итем который занимает все окно, это будет медленней, чем обновить десяток 20x20.

Добавленные строки у меня на машине уменьшили нагрузку процессора в двое.
Записан
sh123
Гость
« Ответ #19 : Март 11, 2009, 13:07 »

Спасибо за информацию, попробую. Еще возникла пара вопросов, некоторые из флагов недоступны в ранних версиях qt4, как быть в этом случае? И возможно ли каким либо образом инициировать репаинт итема, без его uрdate из моего кода. Любые идеи в принципе подойдут, даже самые извращенные Улыбающийся главное добиться как можно меньшей нагрузки на проц. Заранее благодарен!
Записан
BRE
Гость
« Ответ #20 : Март 11, 2009, 13:18 »

Спасибо за информацию, попробую. Еще возникла пара вопросов, некоторые из флагов недоступны в ранних версиях qt4, как быть в этом случае? И возможно ли каким либо образом инициировать репаинт итема, без его uрdate из моего кода. Любые идеи в принципе подойдут, даже самые извращенные Улыбающийся главное добиться как можно меньшей нагрузки на проц. Заранее благодарен!
Как мне кажется, тут нужно исходить из того, какой тебе необходим функционал от Qt?
Будут повороты, масштабирование? Необходимость выбора итемов мышкой, drag&drop?
Может проще будет на pixmap рисовать.
Записан
sh123
Гость
« Ответ #21 : Март 11, 2009, 15:00 »

Спасибо за информацию, попробую. Еще возникла пара вопросов, некоторые из флагов недоступны в ранних версиях qt4, как быть в этом случае? И возможно ли каким либо образом инициировать репаинт итема, без его uрdate из моего кода. Любые идеи в принципе подойдут, даже самые извращенные Улыбающийся главное добиться как можно меньшей нагрузки на проц. Заранее благодарен!
Как мне кажется, тут нужно исходить из того, какой тебе необходим функционал от Qt?
Будут повороты, масштабирование? Необходимость выбора итемов мышкой, drag&drop?
Может проще будет на pixmap рисовать.


Будет использоваться масштабирование, выбор итемов мышью, драг-н-дроп, горизонтальный и вертикальный скроллинг, количество итемов на сцене 0-20000, некоторые итемы на сцене в зависимости от типа анимированные.
Записан
Khs
Гость
« Ответ #22 : Март 11, 2009, 15:03 »

кстати, мне тоже интересно какие флаги оптимизации View и может самих айтемов желательны в таком случае Улыбающийся (в моем случае для разработки карты дорог, городов и тп.)
Записан
sh123
Гость
« Ответ #23 : Март 11, 2009, 22:05 »

Эти флаги роли не играют также 100 процентов
view->setOptimizationFlags( QGraphicsView::DontClipPainter  | QGraphicsView::DontSavePainterState | QGraphicsView::DontAdjustForAntialiasing );

А вот этот флаг снизил нагрузку в 4 раза
view->setViewportUpdateMode( QGraphicsView::BoundingRectViewportUpdate );

Проблема в том что последний доступен только начиная с 4.4 кути Грустный мне необходимо чтобы апликачка работала на 4.3 тоже. Похоже придётся вообще отказаться от QGraphicsView.
« Последнее редактирование: Март 11, 2009, 23:08 от sh123 » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.138 секунд. Запросов: 21.