2014-11-16 3 views
0

Если рендеринг QML аппаратно ускорен, разве этот простой пример не превосходит эквивалентную реализацию в Qt classic?Почему этот код QML имеет низкую производительность?

import QtQuick 2.3 
import QtQuick.Controls 1.2 

ApplicationWindow { 
    id: app 
    visible: true 
    width: 640 
    height: 480 


    Column { 
     id: cc 
     property real val: 0 

     Row { 
      spacing: 10 
      TextField { 
       id: numRows 
       text: "1" 
       property int value: parseInt(text); 
       validator: IntValidator { bottom: 1; top: 100; } 

      } 
      TextField { 
       id: numCols 
       text: "1" 
       property int value: parseInt(text); 
       validator: IntValidator { bottom: 1; top: 100; } 
      } 
     } 

     Repeater { 
      model: numRows.value 

      Row { 
       Repeater { 
        model: numCols.value 
        Slider { 
         width: app.width/numCols.value 
         height: 18.5 
         value: cc.val 
         onValueChanged: cc.val = value 
        } 
       } 
      } 
     } 
    } 
} 

Я Идея заключается в том, чтобы заполнить экран с строками и столбцами ползунков, и имеет каждый слайдер подключаться к любому другому слайдеру. Для моего экрана я использую 55 строк и 20 столбцов. Когда я перемещаю слайдер, я ожидаю увидеть текущее движение всех слайдеров на экране, но частота кадров очень низкая (я бы догадался от 5 до 10 кадров в секунду). У меня очень мускулистый графический процессор, и я ожидал гораздо лучшей производительности. Что может быть неправильным?

+0

Вы используете OpenGL или УГЛА строить? – dtech

+0

@ddriver Я уверен, что это сборка OpenGL. Есть ли большая разница в производительности между этими двумя? – Arlen

ответ

0

Если вы получаете ползунки 1100, вы просите постоянно обновлять ползунки 1100. Это много посылаемых сигналов. Я не буду спрашивать вас, что вам нужно 1100 синхронизированных слайдеров для ...

Хотя вы можете вставить несколько циклов, только обновив cc.val при нажатии слайдера, это не изменится очень сильно.

В целом, вы можете только серьезно уменьшить выполняемую работу, выбрав stepSize или установить updateValueWhileDragging: false. Вы будете видеть задержку при отпускании слайдера, но частота кадров не будет мешать опыту.

+0

Стоимость сигнала такая же, как и стоимость около 10 вызовов функций, поэтому я не думаю, что это проблема. Очевидно, мне не нужны 1100 слайдеров, но я пытаюсь сравнить производительность рендеринга. Учитывая, что есть аппаратное ускорение с Qt Quick, я ожидал, что этот QML-код будет работать с высокой частотой кадров. – Arlen

+0

Вы должны запустить свой код и подключить QML Profiler к процессу. (в QtCreator нажмите «Анализировать» и нажмите кнопку «Пуск» в представлении Провайдера QML) Он покажет вам, что для обработки одного события мыши требуется много времени. Для меня это занимает примерно от 23 до 27 мс. –

+0

В худшем случае этот код выполняется для каждого пикселя, который вы перемещаете мышь. Поскольку этот код запускается из цикла событий, следующее событие мыши не может обрабатываться до тех пор, пока вы находитесь в этой функции, но они будут стоять в очереди. В этом случае рендеринг «все в одном» имеет наименьшее влияние. Попробуйте найти другой способ для своего теста –

1

Рассматривая это под профилировщиком (CPU, а не QML), большая часть времени, затраченного на это, фактически выполняет рендеринг Slider элементов, используя собственный стиль. Если производительность является важной проблемой, а собственный стиль рабочего стола - нет, я бы посоветовал не использовать QtQuickControls 1, так как стилизация имеет значительную часть накладных расходов.

Если я обновляю свой пример использования QtQuickControls 2, он значительно мягче:

import QtQuick 2.3 
import QtQuick.Controls 2.0 

ApplicationWindow { 
    id: app 
    visible: true 
    width: 640 
    height: 480 


    Column { 
     id: cc 
     property real val: 0 

     Row { 
      spacing: 10 
      TextField { 
       id: numRows 
       text: "1" 
       property int value: parseInt(text); 
       validator: IntValidator { bottom: 1; top: 100; } 

      } 
      TextField { 
       id: numCols 
       text: "1" 
       property int value: parseInt(text); 
       validator: IntValidator { bottom: 1; top: 100; } 
      } 
     } 

     Repeater { 
      model: numRows.value 

      Row { 
       Repeater { 
        model: numCols.value 
        Slider { 
         width: app.width/numCols.value 
         height: 18.5 
         value: cc.val 
         onPositionChanged: cc.val = position 
        } 
       } 
      } 
     } 
    } 
} 
Смежные вопросы