From fa7d1eeb774a3eed8fab3b3bade7c09fda6c587e Mon Sep 17 00:00:00 2001 From: Evan Hemsley <2342303+ehemsley@users.noreply.github.com> Date: Thu, 8 Aug 2019 22:38:48 -0700 Subject: [PATCH] change sets inside pooled dictionaries to be pooled --- encompass-cs/ComponentManager.cs | 14 ++++++--- encompass-cs/ComponentMessageManager.cs | 42 ++++++++++++++++--------- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/encompass-cs/ComponentManager.cs b/encompass-cs/ComponentManager.cs index 2b7119b..a7a7cd4 100644 --- a/encompass-cs/ComponentManager.cs +++ b/encompass-cs/ComponentManager.cs @@ -15,7 +15,7 @@ namespace Encompass private readonly Dictionary> entityIDToComponentIDs = new Dictionary>(); private readonly Dictionary componentIDToEntityID = new Dictionary(); - private readonly Dictionary>> entityIDToComponentTypeToComponentIDs = new Dictionary>>(); + private readonly Dictionary>> entityIDToComponentTypeToComponentIDs = new Dictionary>>(); private readonly Dictionary> typeToComponentIDs = new Dictionary>(); @@ -31,7 +31,7 @@ namespace Encompass internal void RegisterEntity(Guid entityID) { entityIDToComponentIDs.Add(entityID, new HashSet()); - entityIDToComponentTypeToComponentIDs.Add(entityID, new PooledDictionary>()); + entityIDToComponentTypeToComponentIDs.Add(entityID, new PooledDictionary>()); } internal Guid NextID() @@ -53,7 +53,7 @@ namespace Encompass entityIDToComponentIDs[entity.ID].Add(componentID); if (!entityIDToComponentTypeToComponentIDs[entity.ID].ContainsKey(typeof(TComponent))) { - entityIDToComponentTypeToComponentIDs[entity.ID].Add(typeof(TComponent), new HashSet()); + entityIDToComponentTypeToComponentIDs[entity.ID].Add(typeof(TComponent), new PooledSet()); } entityIDToComponentTypeToComponentIDs[entity.ID][typeof(TComponent)].Add(componentID); @@ -92,7 +92,7 @@ namespace Encompass internal IEnumerable> GetComponentsByEntityAndType(Guid entityID) where TComponent : struct, IComponent { - HashSet idSet; + PooledSet idSet; if (entityIDToComponentTypeToComponentIDs.ContainsKey(entityID) && entityIDToComponentTypeToComponentIDs[entityID].TryGetValue(typeof(TComponent), out idSet)) { return idSet.Select(id => (id, (TComponent)IDToComponent[id])); @@ -102,7 +102,7 @@ namespace Encompass internal bool EntityHasComponentOfType(Guid entityID) where TComponent : struct, IComponent { - HashSet idSet; + PooledSet idSet; if (entityIDToComponentTypeToComponentIDs.ContainsKey(entityID) && entityIDToComponentTypeToComponentIDs[entityID].TryGetValue(typeof(TComponent), out idSet)) { return idSet.Count > 0; @@ -202,6 +202,10 @@ namespace Encompass { entityIDToComponentIDs.Remove(entityID); + foreach (var set in entityIDToComponentTypeToComponentIDs[entityID].Values) + { + set.Dispose(); + } entityIDToComponentTypeToComponentIDs[entityID].Dispose(); entityIDToComponentTypeToComponentIDs.Remove(entityID); } diff --git a/encompass-cs/ComponentMessageManager.cs b/encompass-cs/ComponentMessageManager.cs index df1fca2..106ed60 100644 --- a/encompass-cs/ComponentMessageManager.cs +++ b/encompass-cs/ComponentMessageManager.cs @@ -13,25 +13,37 @@ namespace Encompass private readonly Dictionary> componentMessageTypeToPendingComponentIDs = new Dictionary>(); private readonly Dictionary> componentMessageTypeToComponentIDs = new Dictionary>(); - private readonly Dictionary>> entityToTypeToExistingComponentIDs = new Dictionary>>(); - private readonly Dictionary>> entityToTypeToPendingComponentIDs = new Dictionary>>(); - private readonly Dictionary>> entityToTypeToComponentIDs = new Dictionary>>(); + private readonly Dictionary>> entityToTypeToExistingComponentIDs = new Dictionary>>(); + private readonly Dictionary>> entityToTypeToPendingComponentIDs = new Dictionary>>(); + private readonly Dictionary>> entityToTypeToComponentIDs = new Dictionary>>(); internal void RegisterEntity(Entity entity) { - entityToTypeToComponentIDs[entity] = new PooledDictionary>(); - entityToTypeToPendingComponentIDs[entity] = new PooledDictionary>(); - entityToTypeToExistingComponentIDs[entity] = new PooledDictionary>(); + entityToTypeToComponentIDs[entity] = new PooledDictionary>(); + entityToTypeToPendingComponentIDs[entity] = new PooledDictionary>(); + entityToTypeToExistingComponentIDs[entity] = new PooledDictionary>(); } internal void RegisterDestroyedEntity(Entity entity) { + foreach (var set in entityToTypeToComponentIDs[entity].Values) + { + set.Dispose(); + } entityToTypeToComponentIDs[entity].Dispose(); entityToTypeToComponentIDs.Remove(entity); + foreach (var set in entityToTypeToPendingComponentIDs[entity].Values) + { + set.Dispose(); + } entityToTypeToPendingComponentIDs[entity].Dispose(); entityToTypeToPendingComponentIDs.Remove(entity); + foreach (var set in entityToTypeToExistingComponentIDs[entity].Values) + { + set.Dispose(); + } entityToTypeToExistingComponentIDs[entity].Dispose(); entityToTypeToExistingComponentIDs.Remove(entity); } @@ -93,7 +105,7 @@ namespace Encompass if (!entityToTypeToExistingComponentIDs[componentMessage.entity].ContainsKey(typeof(TComponent))) { - entityToTypeToExistingComponentIDs[componentMessage.entity].Add(typeof(TComponent), new HashSet()); + entityToTypeToExistingComponentIDs[componentMessage.entity].Add(typeof(TComponent), new PooledSet()); } entityToTypeToExistingComponentIDs[componentMessage.entity][typeof(TComponent)].Add(componentMessage.componentID); @@ -112,7 +124,7 @@ namespace Encompass if (!entityToTypeToPendingComponentIDs[pendingComponentMessage.entity].ContainsKey(typeof(TComponent))) { - entityToTypeToPendingComponentIDs[pendingComponentMessage.entity].Add(typeof(TComponent), new HashSet()); + entityToTypeToPendingComponentIDs[pendingComponentMessage.entity].Add(typeof(TComponent), new PooledSet()); } entityToTypeToPendingComponentIDs[pendingComponentMessage.entity][typeof(TComponent)].Add(pendingComponentMessage.componentID); @@ -130,7 +142,7 @@ namespace Encompass if (!entityToTypeToComponentIDs[entity].ContainsKey(typeof(TComponent))) { - entityToTypeToComponentIDs[entity].Add(typeof(TComponent), new HashSet()); + entityToTypeToComponentIDs[entity].Add(typeof(TComponent), new PooledSet()); } entityToTypeToComponentIDs[entity][typeof(TComponent)].Add(componentID); @@ -227,7 +239,7 @@ namespace Encompass internal IEnumerable<(Guid, TComponent)> ReadExistingAndPendingComponentsByEntityAndType(Entity entity) where TComponent : struct, IComponent { - HashSet idSet; + PooledSet idSet; if (entityToTypeToComponentIDs.ContainsKey(entity) && entityToTypeToComponentIDs[entity].TryGetValue(typeof(TComponent), out idSet)) { return idSet.Select(id => (id, (TComponent)componentIDToComponent[id])); @@ -238,7 +250,7 @@ namespace Encompass internal IEnumerable<(Guid, TComponent)> ReadExistingComponentsByEntityAndType(Entity entity) where TComponent : struct, IComponent { - HashSet idSet; + PooledSet idSet; if (entityToTypeToExistingComponentIDs.ContainsKey(entity) && entityToTypeToExistingComponentIDs[entity].TryGetValue(typeof(TComponent), out idSet)) { return idSet.Select(id => (id, (TComponent)componentIDToComponent[id])); @@ -249,7 +261,7 @@ namespace Encompass internal IEnumerable<(Guid, TComponent)> ReadPendingComponentsByEntityAndType(Entity entity) where TComponent : struct, IComponent { - HashSet idSet; + PooledSet idSet; if (entityToTypeToPendingComponentIDs.ContainsKey(entity) && entityToTypeToPendingComponentIDs[entity].TryGetValue(typeof(TComponent), out idSet)) { return idSet.Select(id => (id, (TComponent)componentIDToComponent[id])); @@ -279,7 +291,7 @@ namespace Encompass internal bool HasExistingOrPendingComponent(Entity entity) where TComponent : struct, IComponent { - HashSet idSet; + PooledSet idSet; if (entityToTypeToComponentIDs.TryGetValue(entity, out _) && entityToTypeToComponentIDs[entity].TryGetValue(typeof(TComponent), out idSet)) { return idSet.Count > 0; @@ -290,7 +302,7 @@ namespace Encompass internal bool HasExistingComponent(Entity entity) where TComponent : struct, IComponent { - HashSet idSet; + PooledSet idSet; if (entityToTypeToExistingComponentIDs.TryGetValue(entity, out _) && entityToTypeToExistingComponentIDs[entity].TryGetValue(typeof(TComponent), out idSet)) { return idSet.Count > 0; @@ -301,7 +313,7 @@ namespace Encompass internal bool HasPendingComponent(Entity entity) where TComponent : struct, IComponent { - HashSet idSet; + PooledSet idSet; if (entityToTypeToPendingComponentIDs.TryGetValue(entity, out _) && entityToTypeToPendingComponentIDs[entity].TryGetValue(typeof(TComponent), out idSet)) { return idSet.Count > 0;