Я использую графический API Qt для отображения слоев в некоторых программах ГИС.Ошибка производительности с QGraphicsScene :: createItemGroup
Каждый слой представляет собой группу, содержащую графические примитивы. У меня проблема с производительности при загрузке довольно больших массивов данных, например это то, что происходит, когда делает группу, состоящую из ~ 96K круговых путей (точек из шейп):
callgrind image http://f.imagehost.org/0750/profile-createItemGroup.png
Полная callgrind дамп here.
QGraphicsScene::createItemGroup()
вызов занимает около 150 секунд до полной на моем 2,4 ГГц Core2, и, кажется, все это время используется в QGraphicsItemPrivate::updateEffectiveOpacity()
, который сам по себе потребляет 37% своего времени вызывающему QGraphicsItem::flags()
4 миллиарда раз ( данные взяты из тестового скрипта без GUI, просто сцены, даже не привязаны к ).
Все остальное в значительной степени мгновенно (создание элементов, чтение файла и т. Д.). Я попытался отключить индекс сцены до , создав группу и получив аналогичные результаты.
Что можно сделать для улучшения характеристик в этом случае? Если я не могу, есть ли способ создать группы быстрее?
У вас есть дополнительная информация? Какие предметы вы используете? Кто вызывает метод flags и методы updateEffectOpacity, группу или элементы? Какие флаги установлены для элементов? –
Элементы 'QGraphicsEllipseItem' с установленным флагом' QGraphicsItem :: ItemIgnoresTransformations'. Методы 'flags()' и 'updateEffectiveOpacity()' вызываются из 'QGraphicsScene :: createItemGroup()'. –
И удаление флажка 'ItemIgnoresTransformations' ничего не изменит –