From e61817ff6a8f419c4c53abcdd0697e2141d7d0ab Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Tue, 24 Feb 2026 22:47:18 +0800 Subject: [PATCH] [Fix] (MG_Backend/DirectGLES): Improve iteration safety in CollectGarbage. --- MobileGL/MG_Backend/DirectGLES/Managers.h | 25 +++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.h b/MobileGL/MG_Backend/DirectGLES/Managers.h index 9f58bfe6..59ffb7a5 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.h +++ b/MobileGL/MG_Backend/DirectGLES/Managers.h @@ -79,14 +79,26 @@ namespace MobileGL::MG_Backend::DirectGLES { } void CollectGarbage() { - for (auto trackedStateIt = m_stateRefs.begin(); trackedStateIt != m_stateRefs.end();) { - if (trackedStateIt->second.expired()) { - m_backendObjects.erase(trackedStateIt->first); - trackedStateIt = m_stateRefs.erase(trackedStateIt); - } else { - ++trackedStateIt; + if (m_isCollecting) { + return; + } + + m_isCollecting = true; + + Vector staleKeys; + staleKeys.reserve(m_stateRefs.size()); + for (const auto& [stateKey, stateWeakRef] : m_stateRefs) { + if (stateWeakRef.expired()) { + staleKeys.push_back(stateKey); } } + + for (auto* stateKey : staleKeys) { + m_stateRefs.erase(stateKey); + m_backendObjects.erase(stateKey); + } + + m_isCollecting = false; } private: @@ -94,6 +106,7 @@ namespace MobileGL::MG_Backend::DirectGLES { StateRefMap m_stateRefs; BackendMap m_backendObjects; Uint32 m_gcTick = 0; + Bool m_isCollecting = false; }; namespace BufferImpl {