我有一个非常复杂的QML视图,其中包含许多图标,按钮,文本等。在此视图中,大约有30个Text项目以1-2Hz更新。 该代码在嵌入式平台上运行,显示出大量的CPU使用率。
我检查了以QSG_RENDERER_DEBUG = render运行的软件的输出,并理解了为什么性能如此差。 在当前状态下,它显示28个批次中的85个节点,这似乎是很多批次。但是最令人不安的信息是所有输出都以“ rebuild:full”开头。
经过一些试验和搜索,我了解到每次重新渲染完整批次都是由于更新了我的文本项内容。尽管Text和其他元素之间没有重叠,但Text项的此更新导致所有其他元素的“重建”。就像一个Text项目实际上可以增长得很大,并且在所有项目上都重叠一样,因此所有项目都需要重新渲染。
然后,我尝试启用对更改的Text项的剪切,并且工作正常,渲染器仅执行“重建:部分”重建,从而提高了软件的性能。
这是渲染器的预期行为吗?剪辑是否还有另一种替代appart,可防止每个更改的Text完全重建?
我已经尝试使用“ elide”属性,但是它不起作用。
为了说明这一点,我使用了一个非常简单的代码(基于Hello world在Qt 5.9上运行),具有4个不重叠的批处理,其中一个是以2Hz更新的文本。
import QtQuick 2.9
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Rectangle {
anchors.top: parent.top
anchors.left: parent.left
height: 20
width: 20
color: "red"
}
Rectangle {
anchors.bottom: parent.bottom
anchors.left: parent.left
height: 20
width: 20
color: "red"
}
Rectangle {
anchors.top: parent.top
anchors.right: parent.right
height: 20
width: 20
color: "red"
layer.enabled: true
}
Rectangle {
anchors.bottom: parent.bottom
anchors.right: parent.right
height: 20
width: 20
color: "red"
layer.enabled: true
}
Text {
id: textItem
height: 200
width: 200
clip: false
property int counter: 0
text: "Counter : " + counter
font.pixelSize: 30
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
Timer {
interval: 500
repeat: true
running: true
onTriggered: textItem.counter = (textItem.counter + 1) % 10;
}
}
当clip为false时,渲染器的输出给出:
Renderer::render() QSGAbstractRenderer(0x1a30ed78) "rebuild: full"
Rendering:
-> Opaque: 2 nodes in 1 batches...
-> Alpha: 3 nodes in 3 batches...
- 0x2cee6820 [ upload] [noclip] [opaque] [ merged] Nodes: 2 Vertices: 8 Indices: 12 root: 0x0
- 0x2cee6868 [ upload] [noclip] [ alpha] [ merged] Nodes: 1 Vertices: 4 Indices: 6 root: 0x0 opacity: 1
- 0x2cee68b0 [ upload] [noclip] [ alpha] [ merged] Nodes: 1 Vertices: 4 Indices: 6 root: 0x0 opacity: 1
- 0x2cee68f8 [ upload] [noclip] [ alpha] [ merged] Nodes: 1 Vertices: 36 Indices: 54 root: 0x0 opacity: 1
-> times: build: 0, prepare(opaque/alpha): 0/0, sorting: 0, upload(opaque/alpha): 0/0, render: 1
当clip为true时(我期望的结果):
Renderer::render() QSGAbstractRenderer(0x1a3175d0) "rebuild: partial"
Rendering:
-> Opaque: 2 nodes in 1 batches...
-> Alpha: 3 nodes in 3 batches...
- 0x2cecd3c0 [retained] [noclip] [opaque] [ merged] Nodes: 2 Vertices: 8 Indices: 12 root: 0x0
- 0x2cecd1c8 [retained] [noclip] [ alpha] [ merged] Nodes: 1 Vertices: 4 Indices: 6 root: 0x0 opacity: 1
- 0x2cecd570 [retained] [noclip] [ alpha] [ merged] Nodes: 1 Vertices: 4 Indices: 6 root: 0x0 opacity: 1
- 0x2cecd408 [ upload] [ clip] [ alpha] [ merged] Nodes: 1 Vertices: 36 Indices: 54 root: 0x2ceb95a0 opacity: 1
-> times: build: 0, prepare(opaque/alpha): 0/0, sorting: 0, upload(opaque/alpha): 0/0, render: 0