From a1839bfc1e941c604fdcfde5a6a88deaa54ccfdf Mon Sep 17 00:00:00 2001 From: Adam Bialogonski Date: Thu, 7 Jan 2016 16:51:17 +0000 Subject: [PATCH] Removed sets of connected/disconnected nodes. Brought back a vector of sorted nodes to support better cache usage. Change-Id: Ifb0aef63759639df77c1c58e5a9b799d7f02f8b0 --- dali/internal/update/manager/update-manager.cpp | 110 ++++++++---------------- dali/internal/update/manager/update-manager.h | 8 -- dali/internal/update/nodes/node-messages.cpp | 5 -- dali/internal/update/nodes/node-messages.h | 19 ---- dali/internal/update/nodes/node.cpp | 18 ++-- dali/internal/update/nodes/node.h | 28 +----- 6 files changed, 43 insertions(+), 145 deletions(-) diff --git a/dali/internal/update/manager/update-manager.cpp b/dali/internal/update/manager/update-manager.cpp index 19a671d..7a37ec4 100644 --- a/dali/internal/update/manager/update-manager.cpp +++ b/dali/internal/update/manager/update-manager.cpp @@ -103,25 +103,6 @@ namespace Internal namespace SceneGraph { -namespace -{ - -void DestroyNodeSet( std::set& nodeSet ) -{ - for( std::set::iterator iter = nodeSet.begin(); iter != nodeSet.end(); ++iter ) - { - Node* node( *iter ); - - // Call Node::OnDestroy as each node is destroyed - node->OnDestroy(); - - delete node; - } - nodeSet.clear(); -} - -} //namespace - typedef OwnerContainer< Shader* > ShaderContainer; typedef ShaderContainer::Iterator ShaderIter; typedef ShaderContainer::ConstIterator ShaderConstIter; @@ -185,6 +166,9 @@ struct UpdateManager::Impl renderers.SetSceneController( *sceneController ); geometries.SetSceneController( *sceneController ); materials.SetSceneController( *sceneController ); + + // create first 'dummy' node + nodes.PushBack(0u); } ~Impl() @@ -203,9 +187,13 @@ struct UpdateManager::Impl } // UpdateManager owns the Nodes - DestroyNodeSet( activeDisconnectedNodes ); - DestroyNodeSet( connectedNodes ); - DestroyNodeSet( disconnectedNodes ); + Vector::Iterator iter = nodes.Begin()+1; + Vector::Iterator endIter = nodes.End(); + for(;iter!=endIter;++iter) + { + (*iter)->OnDestroy(); + delete(*iter); + } // If there is root, reset it, otherwise do nothing as rendering was never started if( root ) @@ -250,9 +238,8 @@ struct UpdateManager::Impl Layer* root; ///< The root node (root is a layer) Layer* systemLevelRoot; ///< A separate root-node for system-level content - std::set< Node* > activeDisconnectedNodes; ///< A container of new or modified nodes (without parent) owned by UpdateManager - std::set< Node* > connectedNodes; ///< A container of connected (with parent) nodes owned by UpdateManager - std::set< Node* > disconnectedNodes; ///< A container of inactive disconnected nodes (without parent) owned by UpdateManager + + Vector nodes; ///< A container of all instantiated nodes SortedLayerPointers sortedLayers; ///< A container of Layer pointers sorted by depth SortedLayerPointers systemLevelSortedLayers; ///< A separate container of system-level Layers @@ -342,7 +329,16 @@ void UpdateManager::AddNode( Node* node ) DALI_ASSERT_ALWAYS( NULL != node ); DALI_ASSERT_ALWAYS( NULL == node->GetParent() ); // Should not have a parent yet - mImpl->activeDisconnectedNodes.insert( node ); // Takes ownership of node + // Nodes must be sorted by pointer + Vector::Iterator begin = mImpl->nodes.Begin(); + for(Vector::Iterator iter = mImpl->nodes.End()-1; iter >= begin; --iter) + { + if(node > (*iter)) + { + mImpl->nodes.Insert((iter+1), node); + break; + } + } } void UpdateManager::ConnectNode( Node* parent, Node* node ) @@ -351,17 +347,6 @@ void UpdateManager::ConnectNode( Node* parent, Node* node ) DALI_ASSERT_ALWAYS( NULL != node ); DALI_ASSERT_ALWAYS( NULL == node->GetParent() ); // Should not have a parent yet - // Move from active/disconnectedNodes to connectedNodes - std::set::size_type removed = mImpl->activeDisconnectedNodes.erase( node ); - if( !removed ) - { - removed = mImpl->disconnectedNodes.erase( node ); - DALI_ASSERT_ALWAYS( removed ); - } - mImpl->connectedNodes.insert( node ); - - node->SetActive( true ); - parent->ConnectChild( node ); } @@ -371,21 +356,7 @@ void UpdateManager::DisconnectNode( Node* node ) DALI_ASSERT_ALWAYS( NULL != parent ); parent->SetDirtyFlag( ChildDeletedFlag ); // make parent dirty so that render items dont get reused - // Move from connectedNodes to activeDisconnectedNodes (reset properties next frame) - parent->DisconnectChild( mSceneGraphBuffers.GetUpdateBufferIndex(), *node, mImpl->connectedNodes, mImpl->activeDisconnectedNodes ); -} - -void UpdateManager::SetNodeActive( Node* node ) -{ - DALI_ASSERT_ALWAYS( NULL != node ); - DALI_ASSERT_ALWAYS( NULL == node->GetParent() ); // Should not have a parent yet - - // Move from disconnectedNodes to activeDisconnectedNodes (reset properties next frame) - std::set::size_type removed = mImpl->disconnectedNodes.erase( node ); - DALI_ASSERT_ALWAYS( removed ); - mImpl->activeDisconnectedNodes.insert( node ); - - node->SetActive( true ); + parent->DisconnectChild( mSceneGraphBuffers.GetUpdateBufferIndex(), *node ); } void UpdateManager::DestroyNode( Node* node ) @@ -393,14 +364,17 @@ void UpdateManager::DestroyNode( Node* node ) DALI_ASSERT_ALWAYS( NULL != node ); DALI_ASSERT_ALWAYS( NULL == node->GetParent() ); // Should have been disconnected - // Transfer ownership from new/disconnectedNodes to the discard queue - // This keeps the nodes alive, until the render-thread has finished with them - std::set::size_type removed = mImpl->activeDisconnectedNodes.erase( node ); - if( !removed ) + Vector::Iterator iter = mImpl->nodes.Begin()+1; + Vector::Iterator endIter = mImpl->nodes.End(); + for(;iter!=endIter;++iter) { - removed = mImpl->disconnectedNodes.erase( node ); - DALI_ASSERT_ALWAYS( removed ); + if((*iter) == node) + { + mImpl->nodes.Erase(iter); + break; + } } + mImpl->discardQueue.Add( mSceneGraphBuffers.GetUpdateBufferIndex(), node ); // Notify the Node about impending destruction @@ -679,25 +653,14 @@ void UpdateManager::ResetProperties( BufferIndex bufferIndex ) mImpl->systemLevelRoot->ResetToBaseValues( bufferIndex ); } - // Reset the Connected Nodes - const std::set::iterator endIter = mImpl->connectedNodes.end(); - for( std::set::iterator iter = mImpl->connectedNodes.begin(); endIter != iter; ++iter ) + // Reset all the nodes + Vector::Iterator iter = mImpl->nodes.Begin()+1; + Vector::Iterator endIter = mImpl->nodes.End(); + for(;iter != endIter; ++iter) { (*iter)->ResetToBaseValues( bufferIndex ); } - // If a Node is disconnected, it may still be "active" (requires a reset in next frame) - for( std::set::iterator iter = mImpl->activeDisconnectedNodes.begin(); mImpl->activeDisconnectedNodes.end() != iter; iter = mImpl->activeDisconnectedNodes.begin() ) - { - Node* node = *iter; - node->ResetToBaseValues( bufferIndex ); - node->SetActive( false ); - - // Move everything from activeDisconnectedNodes to disconnectedNodes (no need to reset again) - mImpl->activeDisconnectedNodes.erase( iter ); - mImpl->disconnectedNodes.insert( node ); - } - // Reset system-level render-task list properties to base values const RenderTaskList::RenderTaskContainer& systemLevelTasks = mImpl->systemLevelTaskList.GetTasks(); @@ -724,7 +687,6 @@ void UpdateManager::ResetProperties( BufferIndex bufferIndex ) mImpl->geometries.ResetToBaseValues( bufferIndex ); mImpl->renderers.ResetToBaseValues( bufferIndex ); - // Reset animatable shader properties to base values for (ShaderIter iter = mImpl->shaders.Begin(); iter != mImpl->shaders.End(); ++iter) { diff --git a/dali/internal/update/manager/update-manager.h b/dali/internal/update/manager/update-manager.h index 6bfb778..1cad203 100644 --- a/dali/internal/update/manager/update-manager.h +++ b/dali/internal/update/manager/update-manager.h @@ -165,14 +165,6 @@ public: void DisconnectNode( Node* node ); /** - * Called when a property is set on a disconnected Node (via public API) - * A disconnected Node has has no parent or children, and its properties cannot be animated/constrained. - * @pre The node does not have a parent. - * @param[in] node The node to set as "active". - */ - void SetNodeActive( Node* node ); - - /** * Destroy a Node owned by UpdateManager. * This is not immediate; Nodes are passed to the RenderQueue to allow GL resources to be deleted. * In the following update, the previously queued Nodes may be deleted. diff --git a/dali/internal/update/nodes/node-messages.cpp b/dali/internal/update/nodes/node-messages.cpp index d3fdf6f..edac935 100644 --- a/dali/internal/update/nodes/node-messages.cpp +++ b/dali/internal/update/nodes/node-messages.cpp @@ -39,11 +39,6 @@ NodePropertyMessageBase::~NodePropertyMessageBase() { } -void NodePropertyMessageBase::NotifyUpdateManager( Node* node ) -{ - mUpdateManager.SetNodeActive( node ); -} - } // namespace SceneGraph } // namespace Internal diff --git a/dali/internal/update/nodes/node-messages.h b/dali/internal/update/nodes/node-messages.h index d49abfa..c11cc6c 100644 --- a/dali/internal/update/nodes/node-messages.h +++ b/dali/internal/update/nodes/node-messages.h @@ -49,13 +49,6 @@ public: */ virtual ~NodePropertyMessageBase(); -protected: - - /** - * Inform UpdateManager that the Node is now active - */ - void NotifyUpdateManager( Node* node ); - private: // Undefined @@ -113,12 +106,6 @@ public: virtual void Process( BufferIndex updateBufferIndex ) { (mProperty->*mMemberFunction)( updateBufferIndex, mParam ); - - if( ! mNode->IsActive() ) - { - // Inform UpdateManager that the Node is now active - NotifyUpdateManager( mNode ); - } } private: @@ -200,12 +187,6 @@ public: virtual void Process( BufferIndex updateBufferIndex ) { (mProperty->*mMemberFunction)( updateBufferIndex, mParam ); - - if( ! mNode->IsActive() ) - { - // Inform UpdateManager that the Node is now active - NotifyUpdateManager( mNode ); - } } private: diff --git a/dali/internal/update/nodes/node.cpp b/dali/internal/update/nodes/node.cpp index d78eaa3..cf4e92a 100644 --- a/dali/internal/update/nodes/node.cpp +++ b/dali/internal/update/nodes/node.cpp @@ -73,7 +73,6 @@ Node::Node() mIsRoot( false ), mInheritOrientation( true ), mInheritScale( true ), - mIsActive( true ), mDrawMode( DrawMode::NORMAL ), mPositionInheritanceMode( DEFAULT_POSITION_INHERITANCE_MODE ), mColorMode( DEFAULT_COLOR_MODE ) @@ -112,10 +111,7 @@ void Node::Attach( NodeAttachment& object ) mAttachment = &object; SetAllDirtyFlags(); - if( mIsActive ) - { - mAttachment->ConnectedToSceneGraph(); - } + mAttachment->ConnectedToSceneGraph(); } void Node::SetRoot(bool isRoot) @@ -193,7 +189,7 @@ void Node::ConnectChild( Node* childNode ) } } -void Node::DisconnectChild( BufferIndex updateBufferIndex, Node& childNode, std::set& connectedNodes, std::set& disconnectedNodes ) +void Node::DisconnectChild( BufferIndex updateBufferIndex, Node& childNode ) { DALI_ASSERT_ALWAYS( this != &childNode ); DALI_ASSERT_ALWAYS( childNode.GetParent() == this ); @@ -214,7 +210,7 @@ void Node::DisconnectChild( BufferIndex updateBufferIndex, Node& childNode, std: } DALI_ASSERT_ALWAYS( NULL != found ); - found->RecursiveDisconnectFromSceneGraph( updateBufferIndex, connectedNodes, disconnectedNodes ); + found->RecursiveDisconnectFromSceneGraph( updateBufferIndex ); } void Node::RemoveRenderer( Renderer* renderer ) @@ -297,7 +293,7 @@ void Node::SetParent(Node& parentNode) mDepth = mParent->GetDepth() + 1u; } -void Node::RecursiveDisconnectFromSceneGraph( BufferIndex updateBufferIndex, std::set& connectedNodes, std::set& disconnectedNodes ) +void Node::RecursiveDisconnectFromSceneGraph( BufferIndex updateBufferIndex ) { DALI_ASSERT_ALWAYS(!mIsRoot); DALI_ASSERT_ALWAYS(mParent != NULL); @@ -305,7 +301,7 @@ void Node::RecursiveDisconnectFromSceneGraph( BufferIndex updateBufferIndex, std const NodeIter endIter = mChildren.End(); for ( NodeIter iter = mChildren.Begin(); iter != endIter; ++iter ) { - (*iter)->RecursiveDisconnectFromSceneGraph( updateBufferIndex, connectedNodes, disconnectedNodes ); + (*iter)->RecursiveDisconnectFromSceneGraph( updateBufferIndex ); } // Animators, Constraints etc. should be disconnected from the child's properties. @@ -324,10 +320,6 @@ void Node::RecursiveDisconnectFromSceneGraph( BufferIndex updateBufferIndex, std mAttachment->DisconnectedFromSceneGraph(); } - // Move into disconnectedNodes - std::set::size_type removed = connectedNodes.erase( this ); - DALI_ASSERT_ALWAYS( removed ); - disconnectedNodes.insert( this ); } } // namespace SceneGraph diff --git a/dali/internal/update/nodes/node.h b/dali/internal/update/nodes/node.h index 1cf0ae1..1f9478a 100644 --- a/dali/internal/update/nodes/node.h +++ b/dali/internal/update/nodes/node.h @@ -118,25 +118,6 @@ public: void operator delete( void* ptr ); /** - * When a Node is marked "active" it has been disconnected, but its properties have been modified. - * @note An inactive Node will be skipped during the UpdateManager ResetProperties stage. - * @param[in] isActive True if the Node is active. - */ - void SetActive( bool isActive ) - { - mIsActive = isActive; - } - - /** - * Query whether the Node is active. - * @return True if the Node is active. - */ - bool IsActive() const - { - return mIsActive; - } - - /** * Called during UpdateManager::DestroyNode shortly before Node is destroyed. */ void OnDestroy(); @@ -291,10 +272,8 @@ public: * @pre childNode is a child of this Node. * @param[in] updateBufferIndex The current update buffer index. * @param[in] childNode The node to disconnect. - * @param[in] connectedNodes Disconnected Node attachments should be removed from here. - * @param[in] disconnectedNodes Disconnected Node attachments should be added here. */ - void DisconnectChild( BufferIndex updateBufferIndex, Node& childNode, std::set& connectedNodes, std::set& disconnectedNodes ); + void DisconnectChild( BufferIndex updateBufferIndex, Node& childNode ); /** * Retrieve the children a Node. @@ -1020,10 +999,8 @@ private: * Recursive helper to disconnect a Node and its children. * Disconnected Nodes have no parent or children. * @param[in] updateBufferIndex The current update buffer index. - * @param[in] connectedNodes Disconnected Node attachments should be removed from here. - * @param[in] disconnectedNodes Disconnected Node attachments should be added here. */ - void RecursiveDisconnectFromSceneGraph( BufferIndex updateBufferIndex, std::set& connectedNodes, std::set& disconnectedNodes ); + void RecursiveDisconnectFromSceneGraph( BufferIndex updateBufferIndex ); public: // Default properties @@ -1066,7 +1043,6 @@ protected: bool mIsRoot:1; ///< True if the node cannot have a parent bool mInheritOrientation:1; ///< Whether the parent's orientation should be inherited. bool mInheritScale:1; ///< Whether the parent's scale should be inherited. - bool mIsActive:1; ///< When a Node is marked "active" it has been disconnected, and its properties have not been modified DrawMode::Type mDrawMode:2; ///< How the Node and its children should be drawn PositionInheritanceMode mPositionInheritanceMode:2;///< Determines how position is inherited, 2 bits is enough -- 2.7.4