diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2020-05-20 14:33:50 +0200 |
---|---|---|
committer | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2020-06-15 08:09:23 +0200 |
commit | a8d357761dbf74cbdc72348be6c655cafb745ff2 (patch) | |
tree | 5d79d2fbf87cc647b7d5515abf7e5272164d2e97 | |
parent | 1f3dd3f5db16892739963168c2a76df6354b178c (diff) |
Speed up rendering huge static scenes
With really big, static scenes, traversal of the geometry list
is expensive enough that it becomes a limitation on the frame
rate if we do it in the inner loop of every frame. And going
through the whole list of geometry every frame just to verify
that nothing has been removed is a waste of time.
In a test with two million opaque items in a single draw call,
I can hit 144 fps with this small optimization versus 50 fps
on the same machine without the patch.
Pick-to: 5.15
Change-Id: Id11c1d96456e79a62c33b89e5f115bdaacceeacd
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | 9 | ||||
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h | 2 |
2 files changed, 11 insertions, 0 deletions
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp index b2d8ab5ff0..643b9ba5fa 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp @@ -791,6 +791,9 @@ bool Batch::geometryWasChanged(QSGGeometryNode *gn) void Batch::cleanupRemovedElements() { + if (!needsPurge) + return; + // remove from front of batch.. while (first && first->removed) { first = first->nextInBatch; @@ -807,6 +810,8 @@ void Batch::cleanupRemovedElements() } } + + needsPurge = false; } /* @@ -1250,6 +1255,7 @@ void Renderer::nodeWasRemoved(Node *node) } if (e->batch) { e->batch->needsUpload = true; + e->batch->needsPurge = true; } } @@ -1273,6 +1279,9 @@ void Renderer::nodeWasRemoved(Node *node) m_elementsToDelete.add(e); if (m_renderNodeElements.isEmpty()) m_forceNoDepthBuffer = false; + + if (e->batch != nullptr) + e->batch->needsPurge = true; } } diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h b/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h index 08b61984bd..fd8b5b436c 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h @@ -460,6 +460,7 @@ struct Batch uploadedThisFrame = false; isRenderNode = false; ubufDataValid = false; + needsPurge = false; clipState.reset(); blendConstant = QColor(); } @@ -479,6 +480,7 @@ struct Batch uint merged : 1; uint isRenderNode : 1; uint ubufDataValid : 1; + uint needsPurge : 1; mutable uint uploadedThisFrame : 1; // solely for debugging purposes |