From: Eunki, Hong Date: Wed, 9 Apr 2025 07:36:25 +0000 (+0900) Subject: Destroy renderer's node index map if node detached X-Git-Tag: dali_2.4.15~6 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6aae3e4c546d489964b705ae6aae3d15cd45a1db;p=platform%2Fcore%2Fuifw%2Fdali-core.git Destroy renderer's node index map if node detached 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 --- diff --git a/dali/internal/render/renderers/render-renderer.cpp b/dali/internal/render/renderers/render-renderer.cpp index a5bbd90d1..6db90d063 100644 --- a/dali/internal/render/renderers/render-renderer.cpp +++ b/dali/internal/render/renderers/render-renderer.cpp @@ -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)