summaryrefslogtreecommitdiffstats
path: root/src/render/frontend
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2015-12-22 17:17:16 +0000
committerSean Harmer <sean.harmer@kdab.com>2015-12-22 20:27:04 +0000
commitedb8bb4d8f2016983f468e770137092948dc69d7 (patch)
treeff70b81e6f5c065c3101f8ab0589a65adbd67e25 /src/render/frontend
parent238f5639bac66f39883cb7d6537ee7bcf88e085e (diff)
Fix slow down seen with long running application
When Qt3D applications are left running for extended periods a gradual slow down was noticed. This turned out to be caused by spending a long time sorting the job dependencies in the thread pooler caused by an ever increasing number of dependencies. This in turn is caused by the render aspect not properly clearing out old dependencies between one frame and the next. This change fixes this kind of mistake in two places. Qt3D applications now no longer slow down over time. Change-Id: I32c258009c98120b38c8c8fa47641dcf336e9588 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/frontend')
-rw-r--r--src/render/frontend/qrenderaspect.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp
index 6c18531d0..a35513d9a 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -367,7 +367,10 @@ QVector<Qt3DCore::QAspectJobPtr> QRenderAspect::jobsToExecute(qint64 time)
jobs.append(triangleComputeJob);
}
- pickBoundingVolumeJob->addDependency(d->m_updateBoundingVolumeJob);
+ // Only add dependency if not already present
+ QVector<QWeakPointer<QAspectJob> > dependencies = pickBoundingVolumeJob->dependencies();
+ if (std::find(dependencies.begin(), dependencies.end(), d->m_updateBoundingVolumeJob) == dependencies.end())
+ pickBoundingVolumeJob->addDependency(d->m_updateBoundingVolumeJob);
// Add all jobs to queue
jobs.append(d->m_calculateBoundingVolumeJob);
@@ -376,6 +379,9 @@ QVector<Qt3DCore::QAspectJobPtr> QRenderAspect::jobsToExecute(qint64 time)
jobs.append(d->m_framePreparationJob);
jobs.append(pickBoundingVolumeJob);
+ // Clear any old dependencies from previous frames
+ d->m_cleanupJob->removeDependency(QWeakPointer<QAspectJob>());
+
// Do not create any more RenderView jobs when the platform surface is gone.
if (d->m_renderer->surface()) {
// Traverse the current framegraph and create jobs to populate