Josh Engebretson 8 лет назад
Родитель
Сommit
70a86aa2e9
2 измененных файлов с 29 добавлено и 47 удалено
  1. 5 46
      Script/AtomicNET/AtomicNET/Core/RefCountedCache.cs
  2. 24 1
      Script/AtomicNET/AtomicNET/Scene/Scene.cs

+ 5 - 46
Script/AtomicNET/AtomicNET/Core/RefCountedCache.cs

@@ -117,58 +117,17 @@ namespace AtomicEngine
         }
         }
 
 
         /// <summary>
         /// <summary>
-        /// WORK IN PROGRESS: Disposes a scene, component, and nodes
+        /// Dispose a list of RefCounted instances
         /// </summary>
         /// </summary>
-        internal static void DisposeScene(Scene scene)
+        internal static void Dispose(List<RefCounted> disposeList)
         {
         {
             lock (knownObjects)
             lock (knownObjects)
             {
             {
-                List<Component> disposeComponents = new List<Component>();
-                List<Node> disposeNodes = new List<Node>();
 
 
-                // Gather nodes/components first as disposing them can remove from scene and children 
-                // won't pass scene test, and thus won't be disposed
-                foreach (var item in knownObjects.Values)
+                foreach (var refCounted in disposeList)
                 {
                 {
-                    var refCounted = item.Reference;
-
-                    if (refCounted == null)
-                    {
-                        // This is relatively infrequent and could be the result of a weakref going away, keeping a 
-                        // warning as it needs to be looked into...
-                        Log.Warn("RefCountedCache.DisposeScene, null RefCounted in known objects");
-                        continue;
-                    }
-
-                    var component = refCounted as Component;
-
-                    if (component != null && !component.Disposed && component.Scene == scene)
-                    {
-                        disposeComponents.Add(component);
-                    }
-
-                    if (component != null)
-                        continue;
-
-                    var node = (Node)(refCounted.GetType() == typeof(Node) ? refCounted : null);
-
-                    if (node != null && !node.Disposed && node.Scene == scene)
-                    {
-                        disposeNodes.Add(node);
-                    }
-
-                }
-
-                foreach (var component in disposeComponents)
-                {
-                    knownObjects.Remove(component);
-                    component.Dispose();
-                }
-
-                foreach (var node in disposeNodes)
-                {
-                    knownObjects.Remove(node);
-                    node.Dispose();
+                    knownObjects.Remove(refCounted);
+                    refCounted.Dispose();
                 }
                 }
 
 
             }
             }

+ 24 - 1
Script/AtomicNET/AtomicNET/Scene/Scene.cs

@@ -13,8 +13,31 @@ namespace AtomicEngine
             UnsubscribeFromAllEvents();
             UnsubscribeFromAllEvents();
 
 
             if (disposing)
             if (disposing)
-                RefCountedCache.DisposeScene(this);
+            {
+                var disposeList = new List<RefCounted>();
+
+                // get all children of scene
+                var nodes = new Vector<Node>();               
+                GetChildren(nodes, true);
+
+                foreach (var node in nodes)
+                {
+
+                    node.GetComponents(componentVector);
+
+                    disposeList.AddRange(componentVector);
+
+                    componentVector.Clear();
 
 
+                }
+
+                disposeList.AddRange(nodes);
+
+                RefCountedCache.Dispose(disposeList);
+            }
+
+                
+            // dispose ourselves
             base.Dispose(disposing);            
             base.Dispose(disposing);            
 
 
         }
         }