Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: d13mon от Январь 21, 2014, 22:09



Название: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
Отправлено: d13mon от Январь 21, 2014, 22:09
Здравствуйте,

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

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


(http://s8.uploads.ru/EnN6p.png)

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

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





Название: Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
Отправлено: gil9red от Январь 21, 2014, 22:22
Есть пример работы с сценой, там я помню отрисовывается очень много элементов, имеет смысл посмотреть его :)
Не помню название, но выглядит так:
(http://doc.crossplatform.ru/qt/4.6.x/images/graphicsview-view.png)

Цитировать
Как правильно пользоваться 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


Название: Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
Отправлено: d13mon от Январь 21, 2014, 22:39
Есть пример работы с сценой, там я помню отрисовывается очень много элементов, имеет смысл посмотреть его :)
Не помню название, но выглядит так:
(http://doc.crossplatform.ru/qt/4.6.x/images/graphicsview-view.png)

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

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

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

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

За совет с  OpenGl спасибо, буду иметь в виду если других вариантов не найду.


Название: Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
Отправлено: gil9red от Январь 21, 2014, 22:55
Нашел ;D
http://qt-project.org/doc/qt-4.8/demos-chip.html


Название: Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
Отправлено: d13mon от Январь 21, 2014, 22:58
Нашел ;D
http://qt-project.org/doc/qt-4.8/demos-chip.html

Ага, спасибо, посмотрю.


Название: Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
Отправлено: kamre от Январь 21, 2014, 23:27
Есть пример работы с сценой, там я помню отрисовывается очень много элементов, имеет смысл посмотреть его :)
Так он точно также тормозит на полном zoom out...


Название: Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
Отправлено: d13mon от Январь 21, 2014, 23:30
Есть пример работы с сценой, там я помню отрисовывается очень много элементов, имеет смысл посмотреть его :)
Так он точно также тормозит на полном zoom out...

На 40к у меня почти не тормозит. Сейчас собрал его, напихаю туда порядка 200к и посмотрим что будет :)


Название: Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
Отправлено: _OLEGator_ от Январь 22, 2014, 10:22
С таким количеством элементов по-любому будет тормозить. Оптимизируй и скрывай ненужные (мелкие) элементы, кому такой информационный шум нужен на максимальном удалении и как с этим будут работать - не понятно.


Название: Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
Отправлено: d13mon от Январь 23, 2014, 23:05
С таким количеством элементов по-любому будет тормозить. Оптимизируй и скрывай ненужные (мелкие) элементы, кому такой информационный шум нужен на максимальном удалении и как с этим будут работать - не понятно.

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

Спасибо за совет. Решил проблему через контроль детализации в QGraphicsItem::paint() через
const qreal lod = option->levelOfDetailFromTransform(painter->worldTransform());


Название: Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
Отправлено: vulko от Март 06, 2014, 16:12
Нарисуйте в OpenGL лучше.
GraphicsScene явно не для большого количества объектов придумывали... мне это напоминает Graphics в Java, оно есть, но не более чем для создания всяких тестовых приложений на коленке...

А вообще все это похоже на картинку фрагментации файлов на диске)) Случаем не для этого делается?


Название: Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
Отправлено: gorec323 от Март 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) отображение в общем стало "летать" при зуммировании и т.п. .