Проблема производительности с QGraphicsScene :: createItemGroup - PullRequest
1 голос
/ 27 января 2010

Я использую графический API Qt для отображения слоев в некоторых программах ГИС.

Каждый слой - это группа, содержащая графические примитивы.У меня проблема с производительностью при загрузке довольно больших наборов данных, например, это происходит при создании группы, состоящей из ~ 96k круговых путей (точек из шейп-файла):

изображение callgrind http://f.imagehost.org/0750/profile-createItemGroup.png

Полный дамп callgrind равен здесь .

Вызов QGraphicsScene::createItemGroup() завершается на моем 2,4 ГГц core2, и кажется, что все это время используется в QGraphicsItemPrivate::updateEffectiveOpacity(), который сам потребляет 37% своего времени, вызывая QGraphicsItem::flags() 4 млрд раз (данные поступают из тестового сценария без графического интерфейса, просто сцена, даже не привязанная к представлению).

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

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

1 Ответ

2 голосов
/ 27 января 2010

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

...