Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB

Qt 5.12 LTS - путь к более быстрому запуску приложений QML

QML, Qt, Quick

Компания Qt уже давно использует такие тесты, как QMLBench, которые помогают нам узнать, когда изменение вызывает снижение производительности, но также важно видеть, как Qt работает на более высоком уровне, позволяя компонентам взаимодействовать таким образом, чего детальные тесты, такие как QMLBench не могут нам показать этого. В этой статье мы рассмотрим результаты тестирования запуска нового приложения из более реального приложения для тестирования QML.

Бенчмарк

Для этих тестов было разработано относительно простое приложение QML, которое использует множество объектов QtDeclarative и QtGraphicalEffects. Код приложения был написан, так как бы его написал обычный разработчик без оптимизации запуска, потребления памяти или производительности. Поскольку мы проводим сравнительный анализ, то приложение не использует интерактивные элементы или пользовательский ввод. Приложение имеет низкую сложность, без расходящейся логики, поэтому результаты как можно более согласованы между запусками теста. Хотя ни один эталонный тест не сможет действительно имитировать реальную производительность при взаимодействии с пользователем, а обсуждаемый тест направлен на более точное представление реальной рабочей нагрузки QML, чем QMLBench или пример «Galery» QtQuickControls.

Тестовое приложение. Оно объединяет текстуры, анимацию, формы QML, повторители, сложный текст, эффекты частиц и шейдеры GL для имитации более тяжелого, более реального приложения, чем другие тесты QML, такие как QMLBench.

Тестовое приложение. Оно объединяет текстуры, анимацию, формы QML, повторители, сложный текст, эффекты частиц и шейдеры GL для имитации более тяжелого, более реального приложения, чем другие тесты QML, такие как QMLBench.

Загрузить исходный код можно по ссылке.

Ранее Ларс писал о приверженности компании Qt улучшению производительности Qt, и с недавним выпуском Qt 5.12 LTS, предпринятые усилия действительно показывают это, особенно в QML. Среди улучшений большое количество было направлено на улучшение производительности запуска. Из протестированных платформ наибольшее улучшение производительности при запуске было отмечено на тестируемом нами устройстве с низким энергопотреблением - Toradex Apalis i.MX6. Давайте рассмотрим это.

Производительность при запуске

Диаграмма выше показывает, как возможности Qt 5.12 LTS действительно снижаeт производительность запуска, уменьшая время до первого кадра с 5912 мс в Qt 5.6 до всего 1258 мс в Qt 5.12.0, что на 79% меньше! Это благодаря ряду новых функций, которые можно объединить для повышения производительности при запуске. Давайте пройдемся по каждому.

Диаграмма выше показывает, как возможности Qt 5.12 LTS действительно снижаeт производительность запуска, уменьшая время до первого кадра с 5912 мс в Qt 5.6 до всего 1258 мс в Qt 5.12.0, что на 79% меньше! Это благодаря ряду новых функций, которые можно объединить для повышения производительности при запуске. Давайте пройдемся по каждому.

  • Шейдерный кеш внедрён в Qt 5.9 LTS
    Кэш шейдеров сохраняет скомпилированные шейдеры OpenGL на диск, благодаря чему можно избежать перекомпиляции шейдеров GL при каждом выполнении.

    Плюсы: уменьшает время запуска и позволяет избежать задержки приложения при обнаружении нового шейдера, если шейдер уже находится в кэше.
    Минусы: Системы с небольшим хранилищем могут иногда очищать кеш шейдеров. Если ваше приложение использует очень сложные шейдеры и работает на маломощном устройстве, где компиляция шейдера может привести к нежелательному времени запуска, возможна рекомендация использовать предварительно скомпилированные шейдеры, чтобы избежать проблем с кэшированием. Нет никакой разницы в производительности между кэшированными шейдерами и предварительно скомпилированными шейдерами.
    Сложности использования: нет! Этот процесс является автоматическим и не требует выполнения вручную.

  • Скомпилированный QML

    Без использования быстрого компилятора Qt, подробно описанного ниже, приложения QML, созданные на версиях Qt до 5.9 LTS, всегда будут компилироваться во время выполнения при каждом запуске приложения. В зависимости от размера приложения и возможностей обработки хоста это действие может привести к нежелательно долгому времени запуска. Два улучшения в Qt теперь позволяют значительно ускорить запуск сложных приложений QML. Оба из них обеспечивают одинаковое повышение производительности при запуске. Это Qt Quick Cache и предварительно сгенерированный QML (Qt Quick Compiler)
    Qt Quick Cache - Представлен в Qt 5.9 LTS Qt Quick Cache сохраняет скомпилированный во время выполнения QML на диск во временном местоположении, так что после первого запуска, когда компилируется QML, его можно напрямую загружать при последующих выполнениях вместо выполнения дорогостоящих компиляций каждый раз.
    Плюсы : может значительно ускорить сложные приложения с большим количеством файлов QML.
    Минусы: если ваше устройство имеет очень маленькое запоминающее устройство, то операционная система может автоматически очищать кэши, что иногда приводит к неожиданно долгому запуску.
    Сложности использования: нет! Этот процесс является автоматическим и не требует выполнения вручную.
    Предварительно сгенерированный QML (Qt Quick Compiler) - Представлен в Qt 5.3 для коммерческих лицензиатов, как коммерческих, так и с открытым исходным кодом, в Qt 5.11 Быстрый компилятор позволяет упаковывать и использовать предварительно скомпилированное QML приложение. Первоначально доступный по коммерческой лицензии начиная с Qt 5.3, он доступен как для коммерческих пользователей, так и для пользователей с открытым исходным кодом, начиная с Qt 5.11.
    Плюсы: Преимущество использования Quick Compiler заключается в том, что ему не нужно полагаться на сгенерированный кэш QML во время выполнения, поэтому вам не нужно беспокоиться о неожиданно долгом времени запуска после того, как конкретный хост приложения очистит свои временные файлы.
    Минусы: нет!
    Сложности использования: низкие. Смотрите соответсвующую документацию. Часто это так же просто, как добавить «qtquickcompiler» к CONFIG в файле .pro вашего проекта!

  • Поля расстояний (Distance Fields) - внедрено в Qt 5.12 LTS

    Хотя Qt уже давно использует поля расстояний при рендеринге шрифтов, чтобы иметь более чистые, четкие, анимируемые шрифты, Qt 5.12 представляет метод предварительного вычисления полей расстояний.
    Плюсы: использование предварительно сгенерированных шрифтов для поля расстояния может значительно снизить производительность при запуске при использовании сложных шрифтов, таких как декоративные латинские шрифты, китайский, японский или санскрит. Если ваше приложение использует много текста, несколько шрифтов или сложные шрифты, предварительная генерация полей расстояния может потратить огромное количество времени на запуск.
    Минусы: Сгенерированные файлы шрифтов поля расстояния будут немного больше на диске, чем стандартные шрифты. Это можно оптимизировать, выбрав только те символы, которые будут отображаться в вашем приложении при использовании инструмента «Генератор полей расстояний». Не выбранные глифы будут рассчитываться по мере необходимости во время выполнения.
    Сложности использования: низкие. Смотрите соответствующую документацию. Никакого дополнительного кода не требуется, и генерация полей расстояния для вашего шрифта занимает секунды.

  • Сжатые текстуры - внедрено в Qt 5.11

    Предоставление OpenGL сжатых текстур, готовых для загрузки в видеопамять прямо из шлюза, избавляет Qt от необходимости готовить файлы других типов (jpg, png и т. Д.) для загрузки.
    Плюсы: использование сжатых текстур обеспечивает более быстрое время запуска, уменьшение использования памяти. Это может даже немного повысить производительность в зависимости от того, насколько интенсивно используется ваша текстура и насколько сильно вы используете сжатие.
    Минусы: Хотя алгоритмы сжатия, используемые для текстур, по своей природе требуют некоторого компромисса в визуальной точности, все схемы сжатия, кроме самых экстремальных, обычно не будут испытывать каких-либо видимых потерь точности. Выбор правильной схемы сжатия для варианта использования вашего приложения является важным фактором.
    Сложности использования: низкие. Практически никакого написания кода не требуется, нужно всего лишь изменить расширения файлов текстур в вашем коде qt.

Выводы

I.MX6 является отличным представлением встраиваемого оборудования среднего уровня, и улучшения производительности, включенные в Qt 5.12 LTS. Соберите все улучшения вместе, и вы действительно сможете сократить время запуска, необходимое для устройств с низким энергопотреблением.

С этими последними результатами испытаний для аппаратного обеспечения с низким энергопотреблением Qt 5.12 может помочь вашей разработке, значительно сократив время запуска, особенно при работе на встраиваемых устройствах низкого и среднего уровня. Эти новые улучшения производительности легко внедрить, требуя лишь самых незначительных изменений в вашей кодовой базе, поэтому есть очень мало причин не сразу начинать использовать Qt 5.12, особенно если ваш проект втиснет тяжелые приложения QML в SoC маленького размера. Приведенная ниже таблица является показателем того, что возможно с Qt 5.12 LTS.

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Last comments
Feb. 21, 2019, 12:51 p.m.
Евгений Легоцкой

Иногда CMake приходится перезапускать начисто, не обновляет кэш
R
Feb. 21, 2019, 12:29 p.m.
RandyGallup

Я указал данные строки, т.к. без них у меня вылетала следующая ошибка: By not providing "FindQt5Core.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configurat...
Feb. 21, 2019, 12:08 p.m.
BlinCT

Вот атк выглядит мой проектник, посмотрите его. cmake_minimum_required(VERSION 3.6)project(projecttimer)set(CMAKE_CXX_STANDARD 11)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)find_packa...
Feb. 21, 2019, 12:04 p.m.
BlinCT

Смотрите, если вы используете глобально для проекта -DCMAKE_PREFIX_PATH= то вам не надо уже указывать вот эти строкиset(Qt5Core_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Core")set(Qt5Gui_DIR...
R
Feb. 21, 2019, 11:54 a.m.
RandyGallup

Даже не запускается. main.cpp у меня точно такой же, как в статье. CMakeLists.txt пришлось немного подправить (прикрепил ниже), т.к. не находились некоторые файлы. cmake_minimum_requi...
Now discuss on the forum
Feb. 21, 2019, 8:58 a.m.
Евгений Легоцкой

Ну у меня координаты передавались в зависимости от положения курсора мыши, а в вам по сути нужно будет аналогичным способом посылать даннные из полей ввода. Так что здесь скорее интерфес...
Feb. 20, 2019, 9:55 p.m.
Евгений Легоцкой

Не до конца понимаю сути вопроса, наверное, нужно увидеть программный код и попытку его применения, но к методам базового класса можно обращаться в наследованном классе через вызов по имени ба...
MU
Feb. 20, 2019, 3:06 p.m.
Maciej Urmański

Yes, ok I have solution! Thank you for directing me about annotate.:) Solution is: users_in = User.objects.filter(joined_users__goal=goal, joined_users__joined=True)
Feb. 20, 2019, 2:40 p.m.
Евгений Легоцкой

Думаю, что ещё можно переопределить mouseReleaseEvent(QMouseEvent* event) у QTableView, который содержит модель и немного поиграться с индексом. Если это индекс, который соответству...
Feb. 20, 2019, 10:34 a.m.
Евгений Легоцкой

Да, так тоже можно. Единственный момент в том, что lupdate не всегда понимает, к какому контексту это дело относится, и может запихать в левый контекст. В небольшом проекте это не критич...
Join us in social networks

For registered users on the site there is a minimum amount of advertising