Одним из недостатков 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