From 19b1ddbc7d25df45c2d7bca4b15ff1be7be5b9b8 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Thu, 22 Feb 2024 00:54:42 +0800 Subject: [PATCH] update DeleteLeakedEntites & rename from DeleteEmptyEntites to DeleteLeakedEntites --- src/EcsWorld.cs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index cea146b..17891ec 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -26,6 +26,9 @@ namespace DCFApixels.DragonECS internal int[] _entityComponentMasks = Array.Empty(); private const int COMPONENT_MATRIX_MASK_BITSIZE = 32; + //"лениво" обновляется только для NewEntity + private long _deleteLeakedEntitesLastVersion = 0; + //обновляется в NewEntity и в DelEntity private long _version = 0; private List> _groups = new List>(); @@ -237,6 +240,11 @@ namespace DCFApixels.DragonECS Throw.World_EntityIsNotContained(entityID); } #endif + unchecked + { + _version++; + _deleteLeakedEntitesLastVersion++; + } _delEntBuffer[_delEntBufferCount++] = entityID; _gens[entityID] |= DEATH_GEN_BIT; _entitiesCount--; @@ -295,15 +303,27 @@ namespace DCFApixels.DragonECS return true; } - public void DeleteEmptyEntites() + public bool DeleteLeakedEntites() { + if (_deleteLeakedEntitesLastVersion == _version) + { + return false; + } + int delCount = 0; foreach (var e in Entities) { if (_componentCounts[e] <= 0) { DelEntity(e); + delCount++; } } + if(delCount > 0) + { + EcsDebug.PrintWarning($"Detected and deleted {delCount} leaking entities."); + } + _deleteLeakedEntitesLastVersion = _version; + return delCount > 0; } #endregion