diff --git a/DataStructures/WeakReference.cs b/DataStructures/WeakReference.cs index 74a199e..cd69d9c 100644 --- a/DataStructures/WeakReference.cs +++ b/DataStructures/WeakReference.cs @@ -12,6 +12,8 @@ namespace Svelto.DataStructures public class WeakReference : WeakReference where T : class { + public bool IsValid { get { return Target != null && IsAlive == true; } } + /// /// Gets or sets the object (the target) referenced by the /// current WeakReference{T} object. diff --git a/ECS/EnginesRoot.cs b/ECS/EnginesRoot.cs index b8c8ef7..9070030 100644 --- a/ECS/EnginesRoot.cs +++ b/ECS/EnginesRoot.cs @@ -20,11 +20,13 @@ namespace Svelto.ES _nodesDBdic = new Dictionary>(); _nodesToAdd = new Queue(); + _nodesToRemove = new Queue(); } public void EndOfFrameTick(float deltaSec) { while (_nodesToAdd.Count > 0) InternalAdd(_nodesToAdd.Dequeue()); + while (_nodesToRemove.Count > 0) InternalRemove(_nodesToRemove.Dequeue()); } public void AddEngine(IEngine engine) @@ -59,7 +61,11 @@ namespace Svelto.ES public void BuildEntity(int ID, EntityDescriptor ed) { - var entityNodes = ed.BuildNodes(ID, (node) => _engineRootWeakReference.Target.InternalRemove(node)); + var entityNodes = ed.BuildNodes(ID, (node) => + { + if (_engineRootWeakReference.isValid == true) + _engineRootWeakReference.Target._nodesToRemove.Enqueue(node); + }); for (int i = 0; i < entityNodes.Count; i++) _nodesToAdd.Enqueue(entityNodes[i]); @@ -158,8 +164,10 @@ namespace Svelto.ES Dictionary> _nodesDBdic; Queue _nodesToAdd; + Queue _nodesToRemove; WeakReference _engineRootWeakReference; + //integrated pooling system //add debug panel like Entitas has //GCHandle should be used to reduce the number of strong references