Проблема рендерера QtQuick при наличии изменяющегося элемента Text - PullRequest
0 голосов
/ 17 мая 2019

У меня довольно сложное представление 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
...