开发者

Performance issue with QGraphicsScene::createItemGroup

I'm using the Qt graphics API to display layers in some GIS software.

Each layer is a group, containing graphic primitives. I have a performance issue when l开发者_如何学运维oading fairly large data sets, for example this is what happens when making a group composed of ~96k circular paths (points from a shapefile):

callgrind image http://f.imagehost.org/0750/profile-createItemGroup.png

The complete callgrind dump is here.

The QGraphicsScene::createItemGroup() call takes about 150 seconds to complete on my 2.4GHz core2, and it seems all this time is used in QGraphicsItemPrivate::updateEffectiveOpacity(), which itself consumes 37% of its time calling QGraphicsItem::flags() 4 billion times (the data comes from a test script with no GUI, just a scene, not even tied to a view).

All the rest is pretty much instantaneous (creating the items, reading the file, etc...). I tried to disable the scene's index before creating the group and obtained similar results.

What could I do to improve performances in this case ? If I can't is there a way to create groups faster ?


After studying the source code a little bit, I found out that the updateEffectiveOpacity has O(n²) with regard to the children of the item's parent item (search for the method qt_allChildrenCombineOpacity). This is probably also the reason that method disappeared in Qt 4.6 and apparently been replaced by something else. Anyway, you should try out setting the ItemDoesntPropagateOpacityToChildren flag on the group item (i.e. you'll have to create it yourself), at least while adding all the items.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜