diff options
author | Kaj Grönholm <kaj.gronholm@qt.io> | 2019-03-12 14:43:53 +0200 |
---|---|---|
committer | Kaj Grönholm <kaj.gronholm@qt.io> | 2019-03-13 13:04:09 +0000 |
commit | 986291112cf5e6b08c74b4e4c77ae9b6cfe09bb6 (patch) | |
tree | 8dc49ac11b7221ab237fa9ccf31384fedcfc66f3 | |
parent | 243fabc5db3f6a78dc8a979d33d043c011f8be7c (diff) |
Start animations at first frame
Delay starting the animations until first frame is rendered.
This fixes issue where animations start progressing before user
may see them. Also it makes sure all (sub)presentations start
animating at the same time.
Task-number: QT3DS-3134
Change-Id: I0edc093bfb07df5bda7ac237aeed151cfbe93846
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
-rw-r--r-- | src/runtime/q3dsengine.cpp | 13 | ||||
-rw-r--r-- | src/runtime/q3dsengine_p.h | 3 | ||||
-rw-r--r-- | src/runtime/q3dsscenemanager.cpp | 14 | ||||
-rw-r--r-- | src/runtime/q3dsscenemanager_p.h | 1 |
4 files changed, 24 insertions, 7 deletions
diff --git a/src/runtime/q3dsengine.cpp b/src/runtime/q3dsengine.cpp index 0ac262c..8f78694 100644 --- a/src/runtime/q3dsengine.cpp +++ b/src/runtime/q3dsengine.cpp @@ -741,11 +741,6 @@ void Q3DSEngine::finalizePresentations() finishAsyncLoad(false); - for (const UipPresentation &pres : m_uipPresentations) { - if (pres.sceneManager) - pres.sceneManager->prepareAnimators(); - } - Q3DSImageManager::instance().finishAsyncLoad(); m_loadTime = m_sourceLoadTimer.elapsed(); @@ -858,6 +853,14 @@ Q3DSSubPresentation Q3DSEngine::loadSubUipPresentation(const QString &subPresId) return sp; } +void Q3DSEngine::startAnimations() +{ + for (const UipPresentation &pres : qAsConst(m_uipPresentations)) { + if (pres.sceneManager) + pres.sceneManager->prepareAnimators(); + } +} + void Q3DSEngine::SceneLoaderAsync::reparentChildren() { for (auto pair : qAsConst(m_parentChildPairs)) { diff --git a/src/runtime/q3dsengine_p.h b/src/runtime/q3dsengine_p.h index baf058b..f72191e 100644 --- a/src/runtime/q3dsengine_p.h +++ b/src/runtime/q3dsengine_p.h @@ -147,6 +147,9 @@ public: // constructed scenes. bool setPresentation(Q3DSUipPresentation *presentations); + // Start animating all uip presentations. + void startAnimations(); + qint64 behaviorLoadTimeMsecs() const; qint64 totalLoadTimeMsecs() const; diff --git a/src/runtime/q3dsscenemanager.cpp b/src/runtime/q3dsscenemanager.cpp index 391573b..cb7c7d2 100644 --- a/src/runtime/q3dsscenemanager.cpp +++ b/src/runtime/q3dsscenemanager.cpp @@ -59,6 +59,7 @@ #include <qmath.h> #include <QTextLayout> #include <QOpenGLContext> +#include <QTimer> #include <Qt3DCore/QEntity> #include <Qt3DCore/QTransform> @@ -650,7 +651,10 @@ void Q3DSSceneManager::uncacheLayers() void Q3DSSceneManager::prepareAnimators() { - m_slidePlayer->sceneReady(); + if (!m_animatorsInitialized) { + m_slidePlayer->sceneReady(); + m_animatorsInitialized = true; + } } QDebug operator<<(QDebug dbg, const Q3DSSceneManager::SceneBuilderParams &p) @@ -670,6 +674,8 @@ void Q3DSSceneManager::prepareEngineReset() delete m_slidePlayer; m_slidePlayer = nullptr; + m_animatorsInitialized = false; + #if QT_CONFIG(q3ds_profileui) if (m_profileUi) m_profileUi->releaseResources(); @@ -1002,7 +1008,6 @@ void Q3DSSceneManager::finalizeSubpresentationLoading(Q3DSSubPresentation *sp) } sp->sceneManager->setSubPresentations(m_subPresentations); if (!m_inSetSubPresentations) { - sp->sceneManager->prepareAnimators(); m_profiler->registerSubPresentationProfiler(sp->sceneManager->m_profiler); Q3DSUipPresentation::forAllObjectsOfType(sp->sceneManager->m_presentation->scene(), Q3DSGraphObject::Behavior, @@ -9247,6 +9252,11 @@ void Q3DSFrameUpdater::frameAction(float dt) // the time includes all subpresentations too) m_sceneManager->m_profiler->reportTotalParseBuildTime(m_sceneManager->m_engine->totalLoadTimeMsecs()); } + + // At this point do synchronized start of engine animations + QTimer::singleShot(0, [this]() { + m_sceneManager->engine()->startAnimations(); + }); } m_sceneManager->m_profiler->reportBehaviorStats(m_sceneManager->m_engine->behaviorLoadTimeMsecs(), m_sceneManager->m_engine->behaviorHandles().count()); diff --git a/src/runtime/q3dsscenemanager_p.h b/src/runtime/q3dsscenemanager_p.h index f8c836d..b9e9450 100644 --- a/src/runtime/q3dsscenemanager_p.h +++ b/src/runtime/q3dsscenemanager_p.h @@ -1029,6 +1029,7 @@ private: bool m_inSetSubPresentations = false; bool m_layerCaching = true; bool m_layerUncachePending = false; + bool m_animatorsInitialized = false; QSet<Q3DSSceneManager *> m_layerCacheDeps; bool m_hasQmlSubPresAsTextureMap = false; Q3DSViewportData m_viewportData; |