У меня довольно сложное представление QML с множеством значков, кнопок, текстов и т. Д. В этом представлении есть около 30 текстовых элементов, которые обновляются с частотой 1-2 Гц.
Этот код работает на встроенной платформе, где он показывает интенсивную загрузку процессора.
Я проверил вывод программного обеспечения, работающего с QSG_RENDERER_DEBUG = render, и понял, почему производительность была такой плохой.
В своем текущем состоянии он показал 85 узлов в 28 партиях, что кажется большим количеством партий. Но самая тревожная информация заключалась в том, что все элементы вывода начинались с «rebuild: full».
После некоторых проб и поисков я понял, что полные пакеты, которые каждый раз перерисовываются, были связаны с тем, что содержимое моих элементов Text было обновлено. Это обновление элементов «Текст» вызвало «перестройку» всех других элементов, даже если не было перекрытия между текстом и другими элементами. Это похоже на то, что текстовый элемент может фактически стать очень большим и перекрывать все элементы, поэтому все элементы необходимо перерисовать.
Затем я попытался включить обрезку на изменяющихся текстовых элементах, и это сработало, средство визуализации выполнило только перестроения: частичные перестройки, что улучшило производительность программного обеспечения.
Это ожидаемое поведение рендерера? Есть ли еще одно альтернативное приложение из отсечения для предотвращения полной перестройки для каждого изменяющегося текста?
Я уже пытался использовать свойство "elide", но оно не работает.
Для иллюстрации этого я использовал очень простой код (работающий на Qt 5.9, основанный на Hello world), с 4 непересекающимися пакетами, один из которых - текст, обновляемый с частотой 2 Гц.
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
Когда клип имеет значение 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