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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QGraphicsView и QGraphicsItem::update оптимизация  (Прочитано 15480 раз)
sh123
Гость
« : Март 10, 2009, 13:06 »

Добрый день, ALL!

У меня сложилась следующая ситуация:

1. Имеется QGraphicsView в котором находится большое количество элементов наследованных от QGraphicsItem (~10000), объекты статические их положение не изменяется, объекты не пересекаются.

2. В текущем viewport-е производится анимация объектов, для каждого элемента по таймеру вызывается QGraphicsItem::update

Проблема:

При вызове QGraphicsItem::update(), происходит ужасная потеря производительности (проц на 90%), похоже что QGraphicsView\QGraphicsScene проивоздит обход всех элементов при этом для каждого вызывает boundingRect().

Имеется ли какая-то возможности оптимизировать данное решение, или может у кого-то есть идеи по этому поводу. Заранее благодарен!
Записан
BRE
Гость
« Ответ #1 : Март 10, 2009, 13:15 »

Самому определять видимые итемы и обновлять только их.
Записан
sh123
Гость
« Ответ #2 : Март 10, 2009, 13:26 »

В данный момент update() вызывается только для итемов находящихся в видимой области, но QGraphicsView обходит все итемы так как я вижу вызовы к boundingRect() что вызывает падение производительности.
Записан
BRE
Гость
« Ответ #3 : Март 10, 2009, 13:30 »

В данный момент update() вызывается только для итемов находящихся в видимой области, но QGraphicsView обходит все итемы так как я вижу вызовы к boundingRect() что вызывает падение производительности.
Конечно обходит, ему же для отрисовки нужно знать, видим ли итем или нет.
Что у тебя в boundingRect()? Может там стоит оптимизировать?
Записан
sh123
Гость
« Ответ #4 : Март 10, 2009, 13:35 »

В boundingRect() пробовал даже возвращать просто фиксированный размер без всяких расчётов, помогло процентов на 30 только. Может есть какой-то способ заставить QGraphicsView не обходить все элементы.
Записан
BRE
Гость
« Ответ #5 : Март 10, 2009, 13:37 »

В boundingRect() пробовал даже возвращать просто фиксированный размер без всяких расчётов, помогло процентов на 30 только. Может есть какой-то способ заставить QGraphicsView не обходить все элементы.
А демонстрашка из Qt 40000 Chip у тебя как работает? Что с производительностью?
Записан
sh123
Гость
« Ответ #6 : Март 10, 2009, 13:47 »

Демка работает приемлимо без тормозов.
Записан
BRE
Гость
« Ответ #7 : Март 10, 2009, 13:49 »

так как я вижу вызовы к boundingRect() что вызывает падение производительности.
А ты как это видишь? Используешь qDebug?
Записан
sh123
Гость
« Ответ #8 : Март 10, 2009, 13:51 »

С выводом на консоль ещё сильнее тормозит Улыбающийся само собой.
Записан
BRE
Гость
« Ответ #9 : Март 10, 2009, 13:51 »

Демка работает приемлимо без тормозов.
Так может это ты что-то делаешь не так?
Покажи код.
Записан
BRE
Гость
« Ответ #10 : Март 10, 2009, 14:17 »

Обрати еще внимание на void QGraphicsView::setViewportUpdateMode ( ViewportUpdateMode mode ).
Записан
sh123
Гость
« Ответ #11 : Март 10, 2009, 14:34 »

При оптимизации boundingRect() удалось добиться примерно 4-х кратного увеличения производительности, setViewPortUpdateMode() не вносит ощутимых изменений. По-видимому, в кутишном примере тормоза не заметны, как update() вызывается только при наведении юзером мыши на элемент, в моём случае периодичность таймера 100 миллисекунд. Странно, что qt тупо не обновляет элементы а обходит все пытаясь понять видимы они или нет и тд, почему нельзя просто обновить тот один элемент, на который я указал?
« Последнее редактирование: Март 10, 2009, 14:44 от sh123 » Записан
BRE
Гость
« Ответ #12 : Март 10, 2009, 14:49 »

Странно, что qt тупо не обновляет элементы а обходит все пытаясь понять видимы они или нет и тд, почему нельзя просто обновить тот один элемент, на который я указал?
Подожди на Qt пинять, покажи свой код.
Записан
BaltikS
Гость
« Ответ #13 : Март 10, 2009, 14:57 »

Чудеса какие-то.... Может в paintEvente что-то нахимичено?
Записан
sh123
Гость
« Ответ #14 : Март 10, 2009, 22:41 »

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

http://lists.trolltech.com/qt4-preview-feedback/2006-09/thread00014-0.html
« Последнее редактирование: Март 10, 2009, 23:42 от sh123 » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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