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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsScene оптимизация?  (Прочитано 4100 раз)
qwyllum
Гость
« : Май 19, 2013, 21:40 »

С-но есть небольшая задача - программа отрисовки карты Беларуси. Данные хранятся в базе Postgresql с дополнением POSTGis. Саму программу уже реализовал. Есть только одна проблемка - десятки тысяч дорог и рек вешают компьютер наглухо. Компьютер весьма слабый - 2ГБ ОЗУ и 2GHz 2 ядра - покупал еще в 2008.
Так что встал вопрос оптимизации. Программа без наворотов вроде масштабирования, просто перемещаешь ползунок и двигаешься по карте. Объекты реализованы классами, наследуемыми от QGraphicsItem, с переопределенными методами paint & boundingrect. Сейчас в программе просто реализован запрос в БД, после чего все объекты добавляются на сцену.

Может кто сталкивался с похожей ситуацией и подскажет, как быть?

PS ламерский вопрос - надо ли освобождать память от Qt-шных объектов?
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #1 : Май 20, 2013, 08:44 »

Может кто сталкивался с похожей ситуацией и подскажет, как быть?
Для начала - определить "узкие" места и тогда уже разбираться с необходимыми оптимизациями

PS ламерский вопрос - надо ли освобождать память от Qt-шных объектов?
Если объекты создаются динамически и в качестве parent указан не NULL, то - не надо. Но я привык удалять созданное собой самостоятельно - хуже не будет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Май 20, 2013, 09:56 »

Ну проблема стандартна/объективна. Какое бы железо ни взяли - всегда найдется "достаточно большая сцена" где это будет тормозить. Конечно надо профилить, как уже сказали. И делать рисование прерываемым. Это выглядит примерно так

- пр отрисовке через каждые напр 100 объектов проверять не двинулся ли ползунок, не нажата ли клавиша и др. (все что вызывает обновление) Если да - выскочить из рисования   
Записан
qwyllum
Гость
« Ответ #3 : Май 20, 2013, 10:09 »

- пр отрисовке через каждые напр 100 объектов проверять не двинулся ли ползунок, не нажата ли клавиша и др. (все что вызывает обновление) Если да - выскочить из рисования   
и как это реализовать? придется наследовать класс от QGraphicsScene и там переопределять метод отрисовки?

Я вообще думал так сделать - смотреть координаты ползунка и делать запрос в БД на объекты с похожими координатами. Но если для мест, которые отображаются точкой это сделать легко, то многие линии дорог и водные области все равно через полкарты ползут. Плюс,затрудняется поиск тем, что данные на выходе получаешь в виде Line(x1 y1, x2 y2....), т.е. придется все это делать переводить в числовой формат для поиска. И не будет ли работа с тысячей строк серьезно замедлять программу?
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #4 : Май 20, 2013, 11:19 »

придется наследовать класс от QGraphicsScene и там переопределять метод отрисовки?
Класс QGraphicsScene не наследуется от QWidget => нет возможности "переопределять метод отрисовки".

Может глянуть что-то более готовое, чем самому с нуля писать?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Май 20, 2013, 12:10 »

и как это реализовать? придется наследовать класс от QGraphicsScene и там переопределять метод отрисовки?
Да просто вставить в рисование каждого айтема проверку на abort.
Да, ну и принципиальный подход - использовать OpenGL
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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