QML Item видимость и вычисления - PullRequest
0 голосов
/ 24 мая 2018

У меня есть файл qml BackgrounPage.qml, который используется в качестве фона для всех моих страниц qml в моем приложении.

Этот фон может быть градиентом, сплошным цветом или изображением.

Итак, я сделал:

BackgroundPage{

  property bool isGradient: false
  property bool isSolid: true //by default
  property bool isImage: false

  //gradient background
  Rectangle{
    visible: isGradient

    ...//create the rectangle

    LinearGradient{
      ...//create gradient
    }
  }

  //solid background
  Rectangle{
    visible: isSolid

    //create rectangle

    color: ...
  }

  Image{
    visible: isImage
    source: ...
  }
}

Это работает хорошо, но для производительности, оптимизации мне интересно, вычисляется ли невидимый элемент QML или нет.Если я создаю сплошной фон, я не хочу, чтобы градиент и изображение вычислялись.

Поэтому мой вопрос: вычисляются ли невидимые элементы в QML?

1 Ответ

0 голосов
/ 24 мая 2018

Что для вас "вычислено"?

Да, объекты созданы и являются "живыми" - поэтому, если есть какие-либо привязки, которые влияют на эти Элементы, они будут оценены.

* 1004Будут ли они оказаны?Нет. Когда они невидимы, движок запрещает им переходить в графический процессор.

Чтобы проверить это утверждение, см. Следующий пример:

ApplicationWindow {
    id: window
    visible: true
    width: 600
    height: 600


    Rectangle {
        width: 100
        height: 100
        color: 'green'

        Timer {
            running: true
            interval: 1000
            repeat: true
            onTriggered: parent.visible = !parent.visible
        }
    }
}

Видимость Rectangle переключается каждыесекунда.
Если вы посмотрите вывод, сгенерированный путем установки переменной envrionment:

QSG_DEBUG_RENDERER=render

, вы увидите, что это переключает количество визуализируемых узлов между 0 и 1.

Rendering:
 -> Opaque: 0 nodes in 0 batches...
 -> Alpha: 0 nodes in 0 batches...
 -> times: build: 0, prepare(opaque/alpha): 0/0, sorting: 0, upload(opaque/alpha): 0/0, render: 0
Renderer::render() QSGAbstractRenderer(0x2341b258) "rebuild: full"
Rendering:
 -> Opaque: 1 nodes in 1 batches...
 -> Alpha: 0 nodes in 0 batches...
 - 0x38589200 [  upload] [noclip] [opaque] [  merged]  Nodes:    1  Vertices:     4  Indices:     6  root: 0x0
 -> times: build: 0, prepare(opaque/alpha): 0/0, sorting: 0, upload(opaque/alpha): 0/0, render: 1
Renderer::render() QSGAbstractRenderer(0x2341b258) "rebuild: none"

Однако лучшим решением было бы использование Loader для загрузки нужного компонента:

Loader {
    sourceComponent: (isGradient ? gradientComponent :
                      (isSolid ? solidComponent :
                       (isImage ? imageComponent : null)))
    Component {
        id: gradientComponent
        ...
    }
    ...
}
...