From 9fb674d769d7e0c90858babcf20d7812203e0a5d Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Fri, 20 May 2011 13:42:16 +0200 Subject: [PATCH] Use QDataBuffer instead of QVector in QMLRenderer. Using QDataBuffer instead of QVector reduces the number of memory reallocations. --- .../scenegraph/coreapi/qsgdefaultrenderer.cpp | 63 +++++++++++--------- .../scenegraph/coreapi/qsgdefaultrenderer_p.h | 10 ++- 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp index 5680843..e2bd8f6 100644 --- a/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp +++ b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp @@ -161,6 +161,9 @@ T Heap::pop() QMLRenderer::QMLRenderer(QSGContext *context) : QSGRenderer(context) + , m_opaqueNodes(64) + , m_transparentNodes(64) + , m_tempNodes(64) , m_rebuild_lists(false) , m_needs_sorting(false) , m_sort_front_to_back(false) @@ -247,8 +250,8 @@ void QMLRenderer::render() m_currentMatrix = 0; if (m_rebuild_lists) { - m_opaqueNodes.clear(); - m_transparentNodes.clear(); + m_opaqueNodes.reset(); + m_transparentNodes.reset(); m_currentRenderOrder = 1; buildLists(rootNode()); m_rebuild_lists = false; @@ -260,10 +263,12 @@ void QMLRenderer::render() if (m_needs_sorting) { - qSort(m_opaqueNodes.begin(), m_opaqueNodes.end(), - m_sort_front_to_back - ? nodeLessThanWithRenderOrder - : nodeLessThan); + if (!m_opaqueNodes.isEmpty()) { + qSort(&m_opaqueNodes.first(), &m_opaqueNodes.first() + m_opaqueNodes.size(), + m_sort_front_to_back + ? nodeLessThanWithRenderOrder + : nodeLessThan); + } m_needs_sorting = false; } @@ -370,10 +375,10 @@ void QMLRenderer::buildLists(QSGNode *node) if ((m->flags() & QSGMaterial::Blending) || opacity < 1) { #endif geomNode->setRenderOrder(m_currentRenderOrder - 1); - m_transparentNodes.append(geomNode); + m_transparentNodes.add(geomNode); } else { geomNode->setRenderOrder(m_currentRenderOrder); - m_opaqueNodes.append(geomNode); + m_opaqueNodes.add(geomNode); m_currentRenderOrder += 2; } } @@ -398,37 +403,39 @@ void QMLRenderer::buildLists(QSGNode *node) endIndices[i] = m_transparentNodes.size(); } - Heap heap; - m_tempNodes.clear(); int childNodeCount = m_transparentNodes.size() - baseCount; - while (childNodeCount) { - for (int i = 0; i < count; ++i) { - if (beginIndices[i] != endIndices[i]) - heap.insert(Foo(i, m_transparentNodes.at(beginIndices[i]++))); - } - while (!heap.isEmpty()) { - Foo foo = heap.pop(); - m_tempNodes.append(foo.second); - --childNodeCount; - int i = foo.first; - if (beginIndices[i] != endIndices[i] && !nodeLessThan(m_transparentNodes.at(beginIndices[i]), foo.second)) - heap.insert(Foo(i, m_transparentNodes.at(beginIndices[i]++))); + if (childNodeCount) { + Heap heap; + m_tempNodes.reset(); + m_tempNodes.reserve(childNodeCount); + while (childNodeCount) { + for (int i = 0; i < count; ++i) { + if (beginIndices[i] != endIndices[i]) + heap.insert(Foo(i, m_transparentNodes.at(beginIndices[i]++))); + } + while (!heap.isEmpty()) { + Foo foo = heap.pop(); + m_tempNodes.add(foo.second); + --childNodeCount; + int i = foo.first; + if (beginIndices[i] != endIndices[i] && !nodeLessThan(m_transparentNodes.at(beginIndices[i]), foo.second)) + heap.insert(Foo(i, m_transparentNodes.at(beginIndices[i]++))); + } } - } - Q_ASSERT(m_tempNodes.size() == m_transparentNodes.size() - baseCount); + Q_ASSERT(m_tempNodes.size() == m_transparentNodes.size() - baseCount); - m_transparentNodes.resize(baseCount); - m_transparentNodes << m_tempNodes; + qMemCopy(&m_transparentNodes.at(baseCount), &m_tempNodes.at(0), m_tempNodes.size() * sizeof(QSGGeometryNode *)); + } } else { for (int i = 0; i < count; ++i) buildLists(node->childAtIndex(i)); } } -void QMLRenderer::renderNodes(const QVector &list) +void QMLRenderer::renderNodes(const QDataBuffer &list) { const float scale = 1.0f / m_currentRenderOrder; - int count = list.count(); + int count = list.size(); int currentRenderOrder = 0x80000000; //int clipChangeCount = 0; diff --git a/src/declarative/scenegraph/coreapi/qsgdefaultrenderer_p.h b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer_p.h index 805388a..ca1f559 100644 --- a/src/declarative/scenegraph/coreapi/qsgdefaultrenderer_p.h +++ b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer_p.h @@ -44,6 +44,8 @@ #include "qsgrenderer_p.h" +#include + QT_BEGIN_HEADER QT_BEGIN_NAMESPACE @@ -65,16 +67,16 @@ public: private: void buildLists(QSGNode *node); - void renderNodes(const QVector &list); + void renderNodes(const QDataBuffer &list); const QSGClipNode *m_currentClip; QSGMaterial *m_currentMaterial; QSGMaterialShader *m_currentProgram; const QMatrix4x4 *m_currentMatrix; QMatrix4x4 m_renderOrderMatrix; - QVector m_opaqueNodes; - QVector m_transparentNodes; - QVector m_tempNodes; + QDataBuffer m_opaqueNodes; + QDataBuffer m_transparentNodes; + QDataBuffer m_tempNodes; bool m_rebuild_lists; bool m_needs_sorting; -- 1.7.2.5