Russian Qt Forum
Ноябрь 23, 2024, 08:28
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
2D и 3D графика
>
Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к) (Прочитано 6150 раз)
d13mon
Гость
Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
«
:
Январь 21, 2014, 22:09 »
Здравствуйте,
У меня есть такая задача: хранить на сцене большое число элементов, вплоть до 1 миллиона. Элементы - просто прямоугольники.
Функционал предусматривает зум. Проблема возникает когда большое число элементов (> 100к) и я делаю max zoom out т.е чтобы в виде (QGraphicsView) были одновременно видны все элементы сцены. Проблема в том, что прога начинает жутко тормозить. Предполагаю оттого что ей нужно одновременно обрабатывать все элементы и отрисовывать их.
Здесь наглядно видно ,как выглядит моя сцена. Это просто 4 одинаковых линии, в каждой из которых выстроены элементы. Я попытался организовать данные в несколько уровней: разноцветные блоки - это блоки разных уровней вложенности. Серый-зеленый-красный-желтый-фиолетовый в порядке вложенности. Надо разместить на сцене именно 100К+ самых мелких то есть фиолетовых блоков. Я пробовал линейно то есть без вложенности - также тормозит.
1) Возможно ли сделать так, чтобы тормозов не было? Какие-то параметры сцены-вида-элементов или за счет организации данных?
2) Как правильно пользоваться bspTreeDepth в QGraphicsScene? Вроде как за счет этого параметра можно неплохо выиграть в производительности, но непонятно как определить оптимальный уровень допустим применительно к моей задаче.
Записан
gil9red
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1805
Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
«
Ответ #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
»
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
d13mon
Гость
Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
«
Ответ #2 :
Январь 21, 2014, 22:39 »
Цитата: gil9red от Январь 21, 2014, 22:22
Есть пример работы с сценой, там я помню отрисовывается очень много элементов, имеет смысл посмотреть его
Не помню название, но выглядит так:
Цитировать
Как правильно пользоваться bspTreeDepth в QGraphicsScene? Вроде как за счет этого параметра можно неплохо выиграть в производительности, но непонятно как определить оптимальный уровень допустим применительно к моей задаче.
http://doc.crossplatform.ru/qt/4.6.x/qgraphicsscene.html#bspTreeDepth-prop
Можно еще сцену через OpenGL отрисовывать - производительность тоже должна стать выше
Когда-то изучал примеры из справки, пересмотрю ещё раз, может чего упустил.
По bspTreeDepth: доки смотрел, мне всё равно непонятно. Найти бы толковый пример использования. Может кто пользовался и подскажет, стоит ли это использовать.
За совет с OpenGl спасибо, буду иметь в виду если других вариантов не найду.
Записан
gil9red
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1805
Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
«
Ответ #3 :
Январь 21, 2014, 22:55 »
Нашел
http://qt-project.org/doc/qt-4.8/demos-chip.html
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
d13mon
Гость
Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
«
Ответ #4 :
Январь 21, 2014, 22:58 »
Цитата: gil9red от Январь 21, 2014, 22:55
Нашел
http://qt-project.org/doc/qt-4.8/demos-chip.html
Ага, спасибо, посмотрю.
Записан
kamre
Частый гость
Offline
Сообщений: 233
Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
«
Ответ #5 :
Январь 21, 2014, 23:27 »
Цитата: gil9red от Январь 21, 2014, 22:22
Есть пример работы с сценой, там я помню отрисовывается очень много элементов, имеет смысл посмотреть его
Так он точно также тормозит на полном zoom out...
Записан
d13mon
Гость
Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
«
Ответ #6 :
Январь 21, 2014, 23:30 »
Цитата: kamre от Январь 21, 2014, 23:27
Цитата: gil9red от Январь 21, 2014, 22:22
Есть пример работы с сценой, там я помню отрисовывается очень много элементов, имеет смысл посмотреть его
Так он точно также тормозит на полном zoom out...
На 40к у меня почти не тормозит. Сейчас собрал его, напихаю туда порядка 200к и посмотрим что будет
Записан
_OLEGator_
Гость
Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
«
Ответ #7 :
Январь 22, 2014, 10:22 »
С таким количеством элементов по-любому будет тормозить. Оптимизируй и скрывай ненужные (мелкие) элементы, кому такой информационный шум нужен на максимальном удалении и как с этим будут работать - не понятно.
Записан
d13mon
Гость
Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
«
Ответ #8 :
Январь 23, 2014, 23:05 »
Цитата: _OLEGator_ от Январь 22, 2014, 10:22
С таким количеством элементов по-любому будет тормозить. Оптимизируй и скрывай ненужные (мелкие) элементы, кому такой информационный шум нужен на максимальном удалении и как с этим будут работать - не понятно.
Да, я это уже понял.
Спасибо за совет. Решил проблему через контроль детализации в QGraphicsItem::paint() через
const qreal lod = option->levelOfDetailFromTransform(painter->worldTransform());
Записан
vulko
Гость
Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
«
Ответ #9 :
Март 06, 2014, 16:12 »
Нарисуйте в OpenGL лучше.
GraphicsScene явно не для большого количества объектов придумывали... мне это напоминает Graphics в Java, оно есть, но не более чем для создания всяких тестовых приложений на коленке...
А вообще все это похоже на картинку фрагментации файлов на диске)) Случаем не для этого делается?
Записан
gorec323
Гость
Re: Тормоза в сцене при одновременном отображении большого числа элементов (от 100к)
«
Ответ #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
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...