QtQuick渲染器存在文本项更改的问题

时间:2019-05-17 13:07:43

标签: qt qml qtquick2 renderer

我有一个非常复杂的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

0 个答案:

没有答案