[Fix] (MG_Backend/DirectGLES): Improve iteration safety in CollectGarbage.

This commit is contained in:
BZLZHH
2026-02-24 22:47:18 +08:00
parent fff00e65c4
commit e61817ff6a
+19 -6
View File
@@ -79,14 +79,26 @@ namespace MobileGL::MG_Backend::DirectGLES {
} }
void CollectGarbage() { void CollectGarbage() {
for (auto trackedStateIt = m_stateRefs.begin(); trackedStateIt != m_stateRefs.end();) { if (m_isCollecting) {
if (trackedStateIt->second.expired()) { return;
m_backendObjects.erase(trackedStateIt->first); }
trackedStateIt = m_stateRefs.erase(trackedStateIt);
} else { m_isCollecting = true;
++trackedStateIt;
Vector<StateObject*> 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: private:
@@ -94,6 +106,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
StateRefMap m_stateRefs; StateRefMap m_stateRefs;
BackendMap m_backendObjects; BackendMap m_backendObjects;
Uint32 m_gcTick = 0; Uint32 m_gcTick = 0;
Bool m_isCollecting = false;
}; };
namespace BufferImpl { namespace BufferImpl {