aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2020-05-20 14:33:50 +0200
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2020-06-15 08:09:23 +0200
commita8d357761dbf74cbdc72348be6c655cafb745ff2 (patch)
tree5d79d2fbf87cc647b7d5515abf7e5272164d2e97
parent1f3dd3f5db16892739963168c2a76df6354b178c (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.cpp9
-rw-r--r--src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h2
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