Performance QGraphicscene::createItemGroup的性能问题

Performance QGraphicscene::createItemGroup的性能问题,performance,qt,graphics,qt4,Performance,Qt,Graphics,Qt4,我正在使用Qt图形API在一些GIS软件中显示图层 每个层都是一个组,包含图形基本体。我有一个 例如,加载相当大的数据集时出现性能问题 这是使一个由~96k个循环组成的群发生的情况 路径(形状文件中的点): 完整的callgrind转储是 调用qgraphicscene::createItemGroup()大约需要150秒才能完成 在我的2.4GHz core2上完成,似乎所有这些时间都用于 QGraphicsItemPrivate::updateEffectiveOpacity(),它本身会

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

每个层都是一个组,包含图形基本体。我有一个 例如,加载相当大的数据集时出现性能问题 这是使一个由~96k个循环组成的群发生的情况 路径(形状文件中的点):

完整的callgrind转储是

调用qgraphicscene::createItemGroup()大约需要150秒才能完成 在我的2.4GHz core2上完成,似乎所有这些时间都用于
QGraphicsItemPrivate::updateEffectiveOpacity()
,它本身会消耗 37%的时间调用
QGraphicsItem::flags()
数据来自一个没有GUI的测试脚本,只是一个场景,甚至没有绑定
(对视图)

其余的都是瞬间完成的(创建项目, 正在读取文件等…)。我以前尝试过禁用场景的索引 创建组并获得类似的结果


在这种情况下,我可以做些什么来提高性能?如果我不能,有没有办法更快地创建组?

在研究了一点源代码后,我发现
updateEffectiveOpacity
对于项的父项的子项(搜索方法)有O(n²)。这可能也是该方法在Qt4.6中消失并被其他方法取代的原因。无论如何,至少在添加所有项目时,您应该尝试在组项目(即,您必须自己创建)上设置
items-doesntrpagateopacitytochildren
标志

您能添加多一点信息吗?你用什么样的东西?谁调用flags方法和updateEffectOpacity方法、组还是项本身?在项目上设置了哪些标志?项目是
QGraphicsEllipseItem
,并设置了
QGraphicsItem::ItemIgnoresTransformations
标志。从
qgraphicscene::createItemGroup()
调用
flags()
updateEffectiveOpacity()
方法。删除
ItemIgnorTransformations
标志不会改变任何事情是!我的加载时间下降到几秒钟,这仍然很慢,但肯定比超过2分钟更容易接受:)(创建组后,我仍然重新激活标志)。非常感谢你!