QGraphicsScene :: createItemGroup的性能问题

时间:2010-01-27 01:58:34

标签: performance qt graphics qt4

我正在使用Qt图形API在某些GIS软件中显示图层。

每个图层都是一个包含图形基元的组。我有一个 例如,在加载相当大的数据集时出现性能问题 这是在制作由~96k圆形组成的组时发生的情况 路径(来自shapefile的点):

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

完整的callgrind转储是here

QGraphicsScene::createItemGroup()通话大约需要150秒 在我的2.4GHz core2上完成,似乎所有这些时间都用在了 QGraphicsItemPrivate::updateEffectiveOpacity(),它本身就消耗了 37%的时间调用QGraphicsItem::flags() 4 十亿次次 数据来自没有GUI的测试脚本,只是一个场景,甚至没有绑定 一个观点)。

所有其余的都是瞬间的(创造物品, 阅读文件等...)。我之前尝试禁用场景的索引 创建小组并获得类似的结果。

在这种情况下,我该怎样做才能提高表现?如果我不能有更快地创建群组的方法吗?

1 个答案:

答案 0 :(得分:2)

稍微研究了源代码之后,我发现updateEffectiveOpacity对于项目的父项的子项(搜索方法qt_allChildrenCombineOpacity)有O(n²)。这可能也是该方法在Qt 4.6中消失并且显然被其他东西取代的原因。无论如何,您应该尝试在小组项目上设置ItemDoesntPropagateOpacityToChildren标记(即您必须自己创建),至少在添加所有项目时。