From 5cc65fef81759971e99a45b27186dde697d22b99 Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Fri, 10 Jun 2011 13:59:13 +0200 Subject: [PATCH] Removed QSGNodeVisitor inheritance from QSGNodeUpdater. This reduces the number of virtual function calls. --- .../scenegraph/coreapi/qsgnodeupdater.cpp | 61 ++++++++++++++++---- .../scenegraph/coreapi/qsgnodeupdater_p.h | 7 +- 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp b/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp index 6eff011..326fd82 100644 --- a/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp +++ b/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp @@ -189,6 +189,13 @@ void QSGNodeUpdater::enterGeometryNode(QSGGeometryNode *g) g->setInheritedOpacity(m_opacity_stack.top()); } +void QSGNodeUpdater::leaveGeometryNode(QSGGeometryNode *g) +{ +#ifdef QSG_UPDATER_DEBUG + qDebug() << "leave geometry" << g; +#endif +} + void QSGNodeUpdater::enterOpacityNode(QSGOpacityNode *o) { if (o->dirtyFlags() & QSGNode::DirtyOpacity) @@ -216,8 +223,11 @@ void QSGNodeUpdater::leaveOpacityNode(QSGOpacityNode *o) void QSGNodeUpdater::visitChildren(QSGNode *n) { - if (!n->isSubtreeBlocked()) - QSGNodeVisitor::visitChildren(n); + if (!n->isSubtreeBlocked()) { + int count = n->childCount(); + for (int i = 0; i < count; ++i) + visitNode(n->childAtIndex(i)); + } } void QSGNodeUpdater::visitNode(QSGNode *n) @@ -226,18 +236,47 @@ void QSGNodeUpdater::visitNode(QSGNode *n) qDebug() << "enter:" << n; #endif - if (n->dirtyFlags() || m_force_update) { - bool forceUpdate = n->dirtyFlags() & (QSGNode::DirtyNodeAdded | QSGNode::DirtyForceUpdate); - if (forceUpdate) - ++m_force_update; + if (!n->dirtyFlags() && !m_force_update) + return; - QSGNodeVisitor::visitNode(n); - - if (forceUpdate) - --m_force_update; + bool forceUpdate = n->dirtyFlags() & (QSGNode::DirtyNodeAdded | QSGNode::DirtyForceUpdate); + if (forceUpdate) + ++m_force_update; - n->clearDirty(); + switch (n->type()) { + case QSGNode::TransformNodeType: { + QSGTransformNode *t = static_cast(n); + enterTransformNode(t); + visitChildren(t); + leaveTransformNode(t); + break; } + case QSGNode::GeometryNodeType: { + QSGGeometryNode *g = static_cast(n); + enterGeometryNode(g); + visitChildren(g); + leaveGeometryNode(g); + break; } + case QSGNode::ClipNodeType: { + QSGClipNode *c = static_cast(n); + enterClipNode(c); + visitChildren(c); + leaveClipNode(c); + break; } + case QSGNode::OpacityNodeType: { + QSGOpacityNode *o = static_cast(n); + enterOpacityNode(o); + visitChildren(o); + leaveOpacityNode(o); + break; } + default: + visitChildren(n); + break; } + + if (forceUpdate) + --m_force_update; + + n->clearDirty(); } QT_END_NAMESPACE diff --git a/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h b/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h index 518cf9e..c10b1ba 100644 --- a/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h +++ b/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h @@ -48,7 +48,7 @@ QT_BEGIN_NAMESPACE -class Q_DECLARATIVE_EXPORT QSGNodeUpdater : public QSGNodeVisitor +class Q_DECLARATIVE_EXPORT QSGNodeUpdater { public: QSGNodeUpdater(); @@ -60,13 +60,14 @@ public: qreal toplevelOpacity() const { return m_opacity_stack.top(); } protected: - void enterTransformNode(QSGTransformNode *); - void leaveTransformNode(QSGTransformNode *); + virtual void enterTransformNode(QSGTransformNode *); + virtual void leaveTransformNode(QSGTransformNode *); void enterClipNode(QSGClipNode *c); void leaveClipNode(QSGClipNode *c); void enterOpacityNode(QSGOpacityNode *o); void leaveOpacityNode(QSGOpacityNode *o); void enterGeometryNode(QSGGeometryNode *); + void leaveGeometryNode(QSGGeometryNode *); void visitNode(QSGNode *n); void visitChildren(QSGNode *n); -- 1.7.2.5