Russian Qt Forum

Qt => Вопросы новичков => Тема начата: qwyllum от Май 19, 2013, 21:40



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

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

PS ламерский вопрос - надо ли освобождать память от Qt-шных объектов?


Название: Re: QGraphicsScene оптимизация?
Отправлено: xokc от Май 20, 2013, 08:44
Может кто сталкивался с похожей ситуацией и подскажет, как быть?
Для начала - определить "узкие" места и тогда уже разбираться с необходимыми оптимизациями

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


Название: Re: QGraphicsScene оптимизация?
Отправлено: Igors от Май 20, 2013, 09:56
Ну проблема стандартна/объективна. Какое бы железо ни взяли - всегда найдется "достаточно большая сцена" где это будет тормозить. Конечно надо профилить, как уже сказали. И делать рисование прерываемым. Это выглядит примерно так

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


Название: Re: QGraphicsScene оптимизация?
Отправлено: qwyllum от Май 20, 2013, 10:09
- пр отрисовке через каждые напр 100 объектов проверять не двинулся ли ползунок, не нажата ли клавиша и др. (все что вызывает обновление) Если да - выскочить из рисования   
и как это реализовать? придется наследовать класс от QGraphicsScene и там переопределять метод отрисовки?

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


Название: Re: QGraphicsScene оптимизация?
Отправлено: kamre от Май 20, 2013, 11:19
придется наследовать класс от QGraphicsScene и там переопределять метод отрисовки?
Класс QGraphicsScene не наследуется от QWidget => нет возможности "переопределять метод отрисовки".

Может глянуть что-то более готовое (http://www.qgis.org/about-qgis/screenshots.html), чем самому с нуля писать?


Название: Re: QGraphicsScene оптимизация?
Отправлено: Igors от Май 20, 2013, 12:10
и как это реализовать? придется наследовать класс от QGraphicsScene и там переопределять метод отрисовки?
Да просто вставить в рисование каждого айтема проверку на abort.
Да, ну и принципиальный подход - использовать OpenGL