Задать вопрос
Wohlstand
@Wohlstand
Инженер-программист С++

Какими способами можно ускорить работу с объектами на сцене при большм удалении?

Имеется рабочая реализация двухмерного графа сцены (Которая создаётся как более оптимизированная замена QGraphicsScene). Все элементы в ней индексированы с помощью алгоритма QuadTree (реализация Loose-Quadtree). Сцена способна хранить в себе больше миллиона различных элементов, и при обычном масштабе даёт близкую к нулю нагрузку на процессор при работе с элементами (выделение, перетаскивание, добавление элементов, прокручивание сцены, и т.п.). (То же количество элементов и те же операции в QGraphicsScene очень неоптимальны не зависимо от настроек индексирования и обновления отрисовки).

Однако, при сильном удалении масштаба, естественно, в поле зрения попадает значительно большее число элементов, чем обычно (примерно 20k~100k). И, соответственно, выделив 15-30 тысяч элементов из них, и, перетасивая их, появляются сильные лаги. Это очевидно, поскольку происходит одновременное обновление состояний всех 30k элементов, а также перерисовка всех остальных 100k (перерисовку можно будет оптимизировать выборочной отрисовкой по зонам).

Вопрос. Какие методы можно применить, чтобы боле-менее оптимизировать производительность работы со сценой при сильном удалении масштаба?
Конкретно, перетаскивание огромных групп элементов. Как вариант, хочу попробовать изобразить гигантскую группу выделенных элементов (например, больше 10k) в виде зонального прямоугольника, не выполняя само перемещение до момента отпускания кнопки мыши. Но думаю, может есть способы по лучше?
  • Вопрос задан
  • 268 просмотров
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 1
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
1. Лодирование -- не показывать и не давать выделить мелкие объекты на таком масштабе.
2. Кластеризация. Объединяем близкие объекты в группы по близости. Например так работают маркеры на яндекс картах. Если производительность упирается в обновление множества объектов, групповое изменение можно сделать асинхронным и ленивым.
3. Можно сделать что-то среднее между 1 и 2. Если граф сцены хорошо группирует объекты логически, то можно прописать лодирование для этих узлов. Например на верхнем уровне у нас есть машина, при увеличении мы можем выделять и двигать отдельные узлы: двери, колеса...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы