不断重绘8000个无形的项目,当鼠标区域也存在一个场景,会导致CPU占用率过高
问题描述:
如何重现:不断重绘8000个无形的项目,当鼠标区域也存在一个场景,会导致CPU占用率过高
- 我的代码运行
- 按住鼠标上出现
你会发现CPU使用率相当高,尽管它取决于你的硬件。在my PC它是20%(4个虚拟内核中的每一个都是5%)。
我给这家测试用例的动机:在我真正的应用程序我有很多的不可见(culled)项目,而剔除帮助了很多与CPU使用率,它并不能帮助像我一样” d期望。
我想知道为什么CPU使用率如此之高以及如何减少它。
我的代码:
main.qml:
import QtQuick 2.5
import QtQuick.Window 2.2
Window {
visible: true
width: 800
height: 500
MouseArea {
width: 1
height: 1
hoverEnabled: true
}
AnimatedItem {
anchors.centerIn: parent
width: 100
height: 100
}
Repeater {
model: 8000
Item {
opacity: 0
layer.enabled: true
width: 1
height: 1
}
}
}
AnimatedItem.qml:
import QtQuick 2.0
Rectangle {
id: root
color: "black"
property real rotAngle: 0
NumberAnimation on rotAngle {
from: 0
to: 360
loops: Animation.Infinite
running: true
duration: 500
}
transform: Rotation {
origin.x: root.width/2
origin.y: root.height/2
angle: root.rotAngle
}
}
我与QML探查,异形它这已经表明在QML中花费了微不足道的时间。所以我也用C++ profiler(CodeXL)进行了剖析。据报道,大部分时间都花在QSGRootNode::~QSGRootNode()
上,因为它叫QSGNodeUpdater::isNodeBlocked(QSGNode*, QSGNode*) const
。我查看了Qt源代码,但一直未能弄清楚为什么它甚至会调用前者。
答
我发现,至少在测试用例有效的解决方案:
设置扑杀项目零的父母,然后将其设置回时,他们unculled。
在一些运行中,它并没有帮助我的真实应用程序,但我不打算深入这一点。