Destroy renderer's node index map if node detached 52/322452/2
authorEunki, Hong <eunkiki.hong@samsung.com>
Wed, 9 Apr 2025 07:36:25 +0000 (16:36 +0900)
committerEunki Hong <eunkiki.hong@samsung.com>
Fri, 11 Apr 2025 01:33:18 +0000 (01:33 +0000)
It will reduce the time of Renderer with single, or multiple Node connected case.

It was useless iterate when renderer with single node (==usual cases) connected
and detached.

Instead, let we just destroy whole container, and re-generate at next render loop.

Change-Id: Ied6dd91b97ce4f693e5a004acfdec11b59bc3f80
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali/internal/render/renderers/render-renderer.cpp

index a5bbd90d18bda037160d2ddbea75e47eb792c1f3..6db90d0636ed315be97c2a691d426f76c4427e83 100644 (file)
@@ -1091,36 +1091,16 @@ void Renderer::DetachFromNodeDataProvider(const SceneGraph::NodeDataProvider& no
     return;
   }
 
-  // Remove mNodeIndexMap and mUniformIndexMaps.
-  auto iter = std::find_if(mNodeIndexMap.begin(), mNodeIndexMap.end(), [&node](RenderItemLookup& element) { return element.node == &node; });
-  while(iter != mNodeIndexMap.end())
-  {
-    // Swap between end of mUniformIndexMaps and removed.
-    auto nodeIndex           = iter->index;
-    auto uniformIndexMapSize = mUniformIndexMaps.size();
-
-    // Remove node index map.
-    mNodeIndexMap.erase(iter);
-
-    if(nodeIndex + 1 != uniformIndexMapSize)
-    {
-      std::swap(mUniformIndexMaps[nodeIndex], mUniformIndexMaps[uniformIndexMapSize - 1u]);
-      // Change node index map.
-      for(auto&& renderItemLookup : mNodeIndexMap)
-      {
-        if(renderItemLookup.index == uniformIndexMapSize - 1u)
-        {
-          renderItemLookup.index = nodeIndex;
-          break;
-        }
-      }
-    }
-
-    // Remove uniform index maps.
-    mUniformIndexMaps.pop_back();
-
-    iter = std::find_if(mNodeIndexMap.begin(), mNodeIndexMap.end(), [&node](RenderItemLookup& element) { return element.node == &node; });
-  }
+  // Destroy whole mNodeIndexMap and mUniformIndexMaps container.
+  // It will be re-created at next render time.
+  // Note : Detach from the node will be happened at RenderManager::PreRender().
+  //        We don't worry about the mNodeIndexMap and mUniformIndexMaps become invalidated after this call.
+  mNodeIndexMap.clear();
+  mUniformIndexMaps.clear();
+#if defined(LOW_SPEC_MEMORY_MANAGEMENT_ENABLED)
+  mNodeIndexMap.shrink_to_fit();
+  mUniformIndexMaps.shrink_to_fit();
+#endif
 }
 
 void Renderer::ProgramDestroyed(const Program* program)