diff options
author | Mike Krus <mike.krus@kdab.com> | 2019-10-23 07:19:49 +0100 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2019-10-28 17:47:13 +0000 |
commit | e5723fd820f5ae2c103c8985ea2d5d27d9bb7ee4 (patch) | |
tree | 03130379c8ea16e100d94f07c24b89e7853c59ac /src/render/services | |
parent | 1597b809a90138afc81fabbe96ffe2be98abc9de (diff) |
Fix frame advance service
on macOS, blocking the main thread waiting for current frame to finish
can lead to events flooding the event queue. In particular, moving the
mouse over the window causes the QBasicTimer used by the uniform
timer that drives (qtquick) animations to no longer fire.
Use tryAcquire to get the resources, waiting a short while to avoid
busy main thread.
Task-number: QTBUG-79379
Change-Id: I930aa8ad7d5a15600d7ac7af93e6e72321457089
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/services')
-rw-r--r-- | src/render/services/vsyncframeadvanceservice.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/render/services/vsyncframeadvanceservice.cpp b/src/render/services/vsyncframeadvanceservice.cpp index b49870e68..d7398e2ce 100644 --- a/src/render/services/vsyncframeadvanceservice.cpp +++ b/src/render/services/vsyncframeadvanceservice.cpp @@ -62,7 +62,7 @@ public: QSemaphore m_semaphore; QElapsedTimer m_elapsed; - quint64 m_elapsedTimeSincePreviousFrame; + qint64 m_elapsedTimeSincePreviousFrame; bool m_drivenByRenderThread; }; @@ -75,14 +75,19 @@ VSyncFrameAdvanceService::~VSyncFrameAdvanceService() { } -// Aspect Thread +// Main Thread qint64 VSyncFrameAdvanceService::waitForNextFrame() { Q_D(VSyncFrameAdvanceService); +#ifdef Q_OS_MACOS + if (!d->m_semaphore.tryAcquire(std::max(d->m_semaphore.available(), 1), 4)) + return -1; +#else d->m_semaphore.acquire(std::max(d->m_semaphore.available(), 1)); +#endif - const quint64 currentTime = d->m_elapsed.nsecsElapsed(); + const qint64 currentTime = d->m_elapsed.nsecsElapsed(); qCDebug(VSyncAdvanceService) << "Elapsed nsecs since last call " << currentTime - d->m_elapsedTimeSincePreviousFrame; d->m_elapsedTimeSincePreviousFrame = currentTime; return currentTime; |