Поток рендеринга анимации в Qt Quick 2.0

в 15:21, , рубрики: qt, qt quick, Qt Software, qt5, threads

Одним из недостатков Qt Quick API является то, что хоть рендеринг и выполняется в выделенном потоке, тем не менее наша анимация всегда работает в потоке графического интерфейса пользователя.

Запуск же анимации за пределами основного потока приложения имеет то преимущество, что значительно снижает влияние ресурсоёмких задач на анимацию, которые обычно блокируют основной поток и приводят к задержкам анимации.

Существуют три основные проблемы, препятствующие нам вынести анимацию в отдельный поток:

  • Анимация обновляющаяся при изменении свойств. Свойства являются частью QObject и системы мета-объектов. Чтобы избежать безумия с потоками, нам разрешается лишь читать и писать эти свойства в потоке графического интерфейса пользователя.
  • Свойства часто имеют привязки и связи в QML, которые вызывают JavaScript-код, при наступлении неких событий, который также должен выполняться в потоке GUI.
  • Цикл рендера в библиотеке QtQuick завязан на поток GUI, а следовательно, когда данный поток заблокирован, анимация не обновляется.


Как было написано в моём предыдущем посте, данный патч устраняет третью проблему, но оставляет открытым вопрос доступа к QObject и приостановке выполнения JavaScript.

Мой коллега, Marko Niemelä, работает над системой анимации, которая решает проблему связи QObject / QML. Его работа со свойством «animations» находится в playground-песочнице.

Это не функционал Qt 5.0, но возможно мы увидим его в Qt 5.1

Наслаждайтесь!

Автор: vitaly_KF


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js