diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-06-24 10:59:08 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-06-25 12:38:55 +0200 |
commit | 7c2badb56eb564327b073fa706fb9c4f809c411a (patch) | |
tree | 941e460dd4d6ab68d7222aa2e04ebdd2eead5646 /src | |
parent | 449d4bcf18f723c70f3f040df49573360d9017a0 (diff) |
QLogicAspect: use QAspectJob::postFrame to drive FrameAction updates
Change-Id: I0707d1f971084fc6671aeb4bd1264c77f6406061
Pick-to: 5.15
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/logic/callbackjob.cpp | 5 | ||||
-rw-r--r-- | src/logic/callbackjob_p.h | 1 | ||||
-rw-r--r-- | src/logic/executor.cpp | 32 | ||||
-rw-r--r-- | src/logic/executor_p.h | 22 | ||||
-rw-r--r-- | src/logic/manager.cpp | 8 | ||||
-rw-r--r-- | src/logic/qlogicaspect.cpp | 3 |
6 files changed, 12 insertions, 59 deletions
diff --git a/src/logic/callbackjob.cpp b/src/logic/callbackjob.cpp index 5dfc74f02..711ce268b 100644 --- a/src/logic/callbackjob.cpp +++ b/src/logic/callbackjob.cpp @@ -61,6 +61,11 @@ void CallbackJob::setManager(Manager *manager) void CallbackJob::run() { +} + +void CallbackJob::postFrame(Qt3DCore::QAspectEngine *aspectEngine) +{ + Q_UNUSED(aspectEngine); Q_ASSERT(m_logicManager); m_logicManager->triggerLogicFrameUpdates(); } diff --git a/src/logic/callbackjob_p.h b/src/logic/callbackjob_p.h index 2dabc77f7..cbe985811 100644 --- a/src/logic/callbackjob_p.h +++ b/src/logic/callbackjob_p.h @@ -67,6 +67,7 @@ public: void setManager(Manager *manager); void run() override; + void postFrame(Qt3DCore::QAspectEngine *aspectEngine) override; private: Manager *m_logicManager; diff --git a/src/logic/executor.cpp b/src/logic/executor.cpp index 41d2f2e31..5a2f2dc51 100644 --- a/src/logic/executor.cpp +++ b/src/logic/executor.cpp @@ -58,41 +58,15 @@ Executor::Executor(QObject *parent) { } -void Executor::clearQueueAndProceed() -{ - // Clear the queue of nodes to process frame updates for (throw the work away). - // If the semaphore is acquired, release it to allow the logic job and hence the - // manager and frame to complete and shutdown to continue. - m_nodeIds.clear(); -} - -void Executor::enqueueLogicFrameUpdates(const QVector<Qt3DCore::QNodeId> &nodeIds) -{ - m_nodeIds = nodeIds; -} - -bool Executor::event(QEvent *e) -{ - if (e->type() == QEvent::User) { - FrameUpdateEvent *ev = static_cast<FrameUpdateEvent *>(e); - processLogicFrameUpdates(ev->deltaTime()); - e->setAccepted(true); - return true; - } - return false; -} - /*! - \internal - Called from context of main thread */ -void Executor::processLogicFrameUpdates(float dt) +void Executor::processLogicFrameUpdates(const QVector<QNodeId> &nodeIds, float dt) { - if (!m_scene || m_nodeIds.isEmpty()) + if (!m_scene || nodeIds.isEmpty()) return; - const QVector<QNode *> nodes = m_scene->lookupNodes(m_nodeIds); + const QVector<QNode *> nodes = m_scene->lookupNodes(nodeIds); for (QNode *node : nodes) { QFrameAction *frameAction = qobject_cast<QFrameAction *>(node); if (frameAction && frameAction->isEnabled()) diff --git a/src/logic/executor_p.h b/src/logic/executor_p.h index f68f0f93c..1e9e0fa8d 100644 --- a/src/logic/executor_p.h +++ b/src/logic/executor_p.h @@ -66,20 +66,6 @@ class QScene; namespace Qt3DLogic { namespace Logic { -class FrameUpdateEvent : public QEvent -{ -public: - FrameUpdateEvent(float dt) - : QEvent(QEvent::User) - , m_dt(dt) - {} - - float deltaTime() const { return m_dt; } - -private: - float m_dt; -}; - class Executor : public QObject { Q_OBJECT @@ -87,17 +73,11 @@ public: explicit Executor(QObject *parent = 0); void setScene(Qt3DCore::QScene *scene) { m_scene = scene; } - void clearQueueAndProceed(); public Q_SLOTS: - void enqueueLogicFrameUpdates(const QVector<Qt3DCore::QNodeId> &nodeIds); - -protected: - bool event(QEvent *e) override; - void processLogicFrameUpdates(float dt); + void processLogicFrameUpdates(const QVector<Qt3DCore::QNodeId> &nodeIds, float dt); private: - QVector<Qt3DCore::QNodeId> m_nodeIds; Qt3DCore::QScene *m_scene; }; diff --git a/src/logic/manager.cpp b/src/logic/manager.cpp index 1131081ee..8f4645a05 100644 --- a/src/logic/manager.cpp +++ b/src/logic/manager.cpp @@ -93,7 +93,7 @@ bool Manager::hasFrameActions() const return m_logicHandlers.count() > 0; } -// Called from Job Thread +// Called from Job postFrame (main thread) void Manager::triggerLogicFrameUpdates() { Q_ASSERT(m_executor); @@ -103,11 +103,7 @@ void Manager::triggerLogicFrameUpdates() if (Qt3DCore::QAbstractAspectPrivate::get(m_logicAspect)->m_aspectManager->isShuttingDown()) return; - // Trigger the main thread to process logic frame updates for each - // logic component and then wait until done. The Executor will - // release the semaphore when it has completed its work. - m_executor->enqueueLogicFrameUpdates(m_logicComponentIds); - qApp->postEvent(m_executor, new FrameUpdateEvent(m_dt)); + m_executor->processLogicFrameUpdates(m_logicComponentIds, m_dt); } } // namespace Logic diff --git a/src/logic/qlogicaspect.cpp b/src/logic/qlogicaspect.cpp index 030d36197..e6fae261e 100644 --- a/src/logic/qlogicaspect.cpp +++ b/src/logic/qlogicaspect.cpp @@ -81,9 +81,6 @@ QLogicAspectPrivate::QLogicAspectPrivate() void QLogicAspectPrivate::onEngineAboutToShutdown() { - // Throw away any pending work that may deadlock during the shutdown procedure - // when the main thread waits for any queued jobs to finish. - m_executor->clearQueueAndProceed(); m_executor->setScene(nullptr); } |