我正在使用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的测试脚本,只是一个场景,甚至没有绑定
一个观点)。
所有其余的都是瞬间的(创造物品, 阅读文件等...)。我之前尝试禁用场景的索引 创建小组并获得类似的结果。
在这种情况下,我该怎样做才能提高表现?如果我不能有更快地创建群组的方法吗?
答案 0 :(得分:2)
稍微研究了源代码之后,我发现updateEffectiveOpacity
对于项目的父项的子项(搜索方法qt_allChildrenCombineOpacity
)有O(n²)。这可能也是该方法在Qt 4.6中消失并且显然被其他东西取代的原因。无论如何,您应该尝试在小组项目上设置ItemDoesntPropagateOpacityToChildren
标记(即您必须自己创建),至少在添加所有项目时。