2010-01-27 3 views
1

Я использую графический 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, просто сцены, даже не привязаны к ).

Все остальное в значительной степени мгновенно (создание элементов, чтение файла и т. Д.). Я попытался отключить индекс сцены до , создав группу и получив аналогичные результаты.

Что можно сделать для улучшения характеристик в этом случае? Если я не могу, есть ли способ создать группы быстрее?

+0

У вас есть дополнительная информация? Какие предметы вы используете? Кто вызывает метод flags и методы updateEffectOpacity, группу или элементы? Какие флаги установлены для элементов? –

+0

Элементы 'QGraphicsEllipseItem' с установленным флагом' QGraphicsItem :: ItemIgnoresTransformations'. Методы 'flags()' и 'updateEffectiveOpacity()' вызываются из 'QGraphicsScene :: createItemGroup()'. –

+0

И удаление флажка 'ItemIgnoresTransformations' ничего не изменит –

ответ

2

Изучив исходный код немного, я обнаружил, что updateEffectiveOpacity имеет O (n²) в отношении дочерних элементов родительского элемента элемента (поиск метода qt_allChildrenCombineOpacity). Вероятно, это также причина, по которой метод исчез в Qt 4.6 и, по-видимому, был заменен чем-то другим. В любом случае, вы должны попробовать установить флаг ItemDoesntPropagateOpacityToChildrenна элемент группы (т. Е. Вам нужно будет создать его самостоятельно), по крайней мере, при добавлении всех элементов.

+0

Yes! мое время загрузки сократилось до нескольких секунд, которое все еще медленное, но более приемлемое, чем более 2 минут :) (я все еще активирую флаг после создания группы). Большое спасибо ! –

Смежные вопросы