diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2015-12-22 17:17:16 +0000 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2015-12-22 20:27:04 +0000 |
commit | edb8bb4d8f2016983f468e770137092948dc69d7 (patch) | |
tree | ff70b81e6f5c065c3101f8ab0589a65adbd67e25 /src/render/frontend | |
parent | 238f5639bac66f39883cb7d6537ee7bcf88e085e (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.cpp | 8 |
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 |