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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)  (Прочитано 6148 раз)
d13mon
Гость
« : Январь 21, 2014, 22:09 »

Здравствуйте,

У меня есть такая задача: хранить на сцене большое число элементов, вплоть до 1 миллиона. Элементы - просто прямоугольники.
Функционал предусматривает зум. Проблема возникает когда большое число элементов (> 100к) и я делаю max zoom out т.е чтобы в виде (QGraphicsView) были одновременно видны все элементы сцены. Проблема в том, что прога начинает жутко тормозить. Предполагаю оттого что ей нужно одновременно обрабатывать все элементы и отрисовывать их.

Здесь наглядно видно ,как выглядит моя сцена. Это просто 4 одинаковых линии, в каждой из которых выстроены элементы. Я попытался организовать данные в несколько уровней: разноцветные блоки - это блоки разных уровней вложенности. Серый-зеленый-красный-желтый-фиолетовый в порядке вложенности. Надо разместить на сцене именно 100К+ самых мелких то есть фиолетовых блоков. Я пробовал линейно то есть без вложенности - также тормозит.




1) Возможно ли сделать так, чтобы тормозов не было? Какие-то параметры сцены-вида-элементов или за счет организации данных?

2) Как правильно пользоваться bspTreeDepth в QGraphicsScene? Вроде как за счет этого параметра можно неплохо выиграть в производительности, но непонятно как определить оптимальный уровень допустим применительно к моей задаче.



Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Январь 21, 2014, 22:22 »

Есть пример работы с сценой, там я помню отрисовывается очень много элементов, имеет смысл посмотреть его Улыбающийся
Не помню название, но выглядит так:


Цитировать
Как правильно пользоваться bspTreeDepth в QGraphicsScene? Вроде как за счет этого параметра можно неплохо выиграть в производительности, но непонятно как определить оптимальный уровень допустим применительно к моей задаче.
http://doc.crossplatform.ru/qt/4.6.x/qgraphicsscene.html#bspTreeDepth-prop

Можно еще сцену через OpenGL отрисовывать - производительность тоже должна стать выше

Также:
http://doc.crossplatform.ru/qt/4.6.x/qgraphicsview.html#optimizationFlags-prop
http://doc.crossplatform.ru/qt/4.6.x/qgraphicsview.html#renderHints-prop
« Последнее редактирование: Январь 21, 2014, 22:36 от gil9red » Записан

d13mon
Гость
« Ответ #2 : Январь 21, 2014, 22:39 »

Есть пример работы с сценой, там я помню отрисовывается очень много элементов, имеет смысл посмотреть его Улыбающийся
Не помню название, но выглядит так:


Цитировать
Как правильно пользоваться bspTreeDepth в QGraphicsScene? Вроде как за счет этого параметра можно неплохо выиграть в производительности, но непонятно как определить оптимальный уровень допустим применительно к моей задаче.
http://doc.crossplatform.ru/qt/4.6.x/qgraphicsscene.html#bspTreeDepth-prop

Можно еще сцену через OpenGL отрисовывать - производительность тоже должна стать выше

Когда-то изучал примеры из справки, пересмотрю ещё раз, может чего упустил.

По bspTreeDepth: доки смотрел, мне всё равно непонятно. Найти бы толковый пример использования. Может кто пользовался и подскажет, стоит ли это использовать.

За совет с  OpenGl спасибо, буду иметь в виду если других вариантов не найду.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Январь 21, 2014, 22:55 »

Нашел Смеющийся
http://qt-project.org/doc/qt-4.8/demos-chip.html
Записан

d13mon
Гость
« Ответ #4 : Январь 21, 2014, 22:58 »


Ага, спасибо, посмотрю.
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #5 : Январь 21, 2014, 23:27 »

Есть пример работы с сценой, там я помню отрисовывается очень много элементов, имеет смысл посмотреть его Улыбающийся
Так он точно также тормозит на полном zoom out...
Записан
d13mon
Гость
« Ответ #6 : Январь 21, 2014, 23:30 »

Есть пример работы с сценой, там я помню отрисовывается очень много элементов, имеет смысл посмотреть его Улыбающийся
Так он точно также тормозит на полном zoom out...

На 40к у меня почти не тормозит. Сейчас собрал его, напихаю туда порядка 200к и посмотрим что будет Улыбающийся
Записан
_OLEGator_
Гость
« Ответ #7 : Январь 22, 2014, 10:22 »

С таким количеством элементов по-любому будет тормозить. Оптимизируй и скрывай ненужные (мелкие) элементы, кому такой информационный шум нужен на максимальном удалении и как с этим будут работать - не понятно.
Записан
d13mon
Гость
« Ответ #8 : Январь 23, 2014, 23:05 »

С таким количеством элементов по-любому будет тормозить. Оптимизируй и скрывай ненужные (мелкие) элементы, кому такой информационный шум нужен на максимальном удалении и как с этим будут работать - не понятно.

Да, я это уже понял.

Спасибо за совет. Решил проблему через контроль детализации в QGraphicsItem::paint() через
const qreal lod = option->levelOfDetailFromTransform(painter->worldTransform());
Записан
vulko
Гость
« Ответ #9 : Март 06, 2014, 16:12 »

Нарисуйте в OpenGL лучше.
GraphicsScene явно не для большого количества объектов придумывали... мне это напоминает Graphics в Java, оно есть, но не более чем для создания всяких тестовых приложений на коленке...

А вообще все это похоже на картинку фрагментации файлов на диске)) Случаем не для этого делается?
Записан
gorec323
Гость
« Ответ #10 : Март 06, 2014, 16:31 »

В документации по QGraphicsScene есть одно полезное свойство:
Цитировать
itemIndexMethod : ItemIndexMethod
This property holds the item indexing method.

QGraphicsScene applies an indexing algorithm to the scene, to speed up item discovery functions like items() and itemAt(). Indexing is most efficient for static scenes (i.e., where items don't move around). For dynamic scenes, or scenes with many animated items, the index bookkeeping can outweight the fast lookup speeds.

For the common case, the default index method BspTreeIndex works fine. If your scene uses many animations and you are experiencing slowness, you can disable indexing by calling setItemIndexMethod(NoIndex).

Access functions:

ItemIndexMethod   itemIndexMethod () const
void   setItemIndexMethod ( ItemIndexMethod method )
See also bspTreeDepth.

Во всяком случае мне оно очень помогло при наличии очень большого количества элементов на сцене. Вызвав функцию setItemIndexMethod(QGraphicsScene::NoIndex) отображение в общем стало "летать" при зуммировании и т.п. .
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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