diff --git a/encompass-cs/ComponentMessageManager.cs b/encompass-cs/ComponentMessageManager.cs index 97b87a1..c2e828f 100644 --- a/encompass-cs/ComponentMessageManager.cs +++ b/encompass-cs/ComponentMessageManager.cs @@ -1,8 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; - -// TODO: object pool for the inner dictionaries so they dont get GC'd +using Collections.Pooled; namespace Encompass { @@ -14,9 +13,9 @@ 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 ClearMessages() { @@ -64,8 +63,22 @@ namespace Encompass internal void RegisterDestroyedEntity(Entity entity) { + foreach (var pooledDictionary in entityToTypeToComponentIDs.Values) + { + pooledDictionary.Dispose(); + } entityToTypeToComponentIDs.Remove(entity); + + foreach (var pooledDictionary in entityToTypeToPendingComponentIDs.Values) + { + pooledDictionary.Dispose(); + } entityToTypeToPendingComponentIDs.Remove(entity); + + foreach (var pooledDictionary in entityToTypeToExistingComponentIDs.Values) + { + pooledDictionary.Dispose(); + } entityToTypeToExistingComponentIDs.Remove(entity); } @@ -82,7 +95,7 @@ namespace Encompass if (!entityToTypeToExistingComponentIDs.ContainsKey(componentMessage.entity)) { - entityToTypeToExistingComponentIDs.Add(componentMessage.entity, new Dictionary>()); + entityToTypeToExistingComponentIDs.Add(componentMessage.entity, new PooledDictionary>()); } if (!entityToTypeToExistingComponentIDs[componentMessage.entity].ContainsKey(typeof(TComponent))) { @@ -105,7 +118,7 @@ namespace Encompass if (!entityToTypeToPendingComponentIDs.ContainsKey(pendingComponentMessage.entity)) { - entityToTypeToPendingComponentIDs.Add(pendingComponentMessage.entity, new Dictionary>()); + entityToTypeToPendingComponentIDs.Add(pendingComponentMessage.entity, new PooledDictionary>()); } if (!entityToTypeToPendingComponentIDs[pendingComponentMessage.entity].ContainsKey(typeof(TComponent))) { @@ -127,7 +140,7 @@ namespace Encompass if (!entityToTypeToComponentIDs.ContainsKey(entity)) { - entityToTypeToComponentIDs.Add(entity, new Dictionary>()); + entityToTypeToComponentIDs.Add(entity, new PooledDictionary>()); } if (!entityToTypeToComponentIDs[entity].ContainsKey(typeof(TComponent))) { diff --git a/encompass-cs/encompass-cs.csproj b/encompass-cs/encompass-cs.csproj index 305e41e..a90f0ce 100644 --- a/encompass-cs/encompass-cs.csproj +++ b/encompass-cs/encompass-cs.csproj @@ -1,4 +1,3 @@ - netstandard2.0 @@ -10,7 +9,7 @@ Moonside Games Encompass ECS https://github.com/encompass-ecs - + Evan Hemsley 2019 Encompass is an engine-agnostic Hyper ECS framework to help you code games, or other kinds of simulations. true @@ -20,7 +19,10 @@ True - + - + + + + \ No newline at end of file