void QSGWindowsRenderLoop::maybeUpdate(QQuickWindow *window) { RLDEBUG("maybeUpdate"); WindowData *wd = windowData(window); if (!wd || !anyoneShowing()) return; wd->pendingUpdate = true; maybePostUpdateTimer(); }
/* * If no windows are showing, start ticking animations using a timer, * otherwise, start rendering */ void QSGWindowsRenderLoop::started() { RLDEBUG("Animations started..."); if (!anyoneShowing()) { if (m_animationTimer == 0) { RLDEBUG(" - starting non-visual animation timer"); m_animationTimer = startTimer(m_vsyncDelta); } } else { maybePostUpdateTimer(); } }
/* * Go through all windows we control and render them in turn. * Then tick animations if active. */ void QSGWindowsRenderLoop::render() { RLDEBUG("render"); bool rendered = false; foreach (const WindowData &wd, m_windows) { if (wd.pendingUpdate) { const_cast<WindowData &>(wd).pendingUpdate = false; renderWindow(wd.window); rendered = true; } } if (!rendered) { RLDEBUG("no changes, sleep"); QThread::msleep(m_vsyncDelta); } if (m_animationDriver->isRunning()) { RLDEBUG("advancing animations"); QSG_LOG_TIME_SAMPLE(time_start); Q_QUICK_SG_PROFILE_START(QQuickProfiler::SceneGraphWindowsAnimations); m_animationDriver->advance(); RLDEBUG("animations advanced"); qCDebug(QSG_LOG_TIME_RENDERLOOP, "animations ticked in %dms", int((qsg_render_timer.nsecsElapsed() - time_start)/1000000)); Q_QUICK_SG_PROFILE_END(QQuickProfiler::SceneGraphWindowsAnimations); // It is not given that animations triggered another maybeUpdate() // and thus another render pass, so to keep things running, // make sure there is another frame pending. maybePostUpdateTimer(); emit timeToIncubate(); } }
/* * Go through all windows we control and render them in turn. * Then tick animations if active. */ void QSGWindowsRenderLoop::render() { RLDEBUG("render"); foreach (const WindowData &wd, m_windows) { if (wd.pendingUpdate) { const_cast<WindowData &>(wd).pendingUpdate = false; renderWindow(wd.window); } } if (m_animationDriver->isRunning()) { RLDEBUG("advancing animations"); QSG_RENDER_TIMING_SAMPLE(time_start); m_animationDriver->advance(); RLDEBUG("animations advanced"); #ifndef QSG_NO_RENDER_TIMING if (qsg_render_timing) { qDebug("WindowsRenderLoop: animations=%d ms", int((qsg_render_timer.nsecsElapsed() - time_start)/1000000)); } if (QQmlProfilerService::Enabled) { QQmlProfilerService::sceneGraphFrame( QQmlProfilerService::SceneGraphWindowsAnimations, qsg_render_timer.nsecsElapsed() - time_start); } #endif // It is not given that animations triggered another maybeUpdate() // and thus another render pass, so to keep things running, // make sure there is another frame pending. maybePostUpdateTimer(); emit timeToIncubate(); } }