From b653fb8a1b763a328f73c5a9d3845bb54a003bb0 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期一, 28 七月 2025 11:12:47 +0800
Subject: [PATCH] 0312 对象池管理,备份代码

---
 Main/Core/ResModule/GameObjectPoolManager.cs |  169 ++++++++++++++++++++++++++++---------------------------
 1 files changed, 86 insertions(+), 83 deletions(-)

diff --git a/Main/Core/ResModule/GameObjectPoolManager.cs b/Main/Core/ResModule/GameObjectPoolManager.cs
index eb3a521..eac955c 100644
--- a/Main/Core/ResModule/GameObjectPoolManager.cs
+++ b/Main/Core/ResModule/GameObjectPoolManager.cs
@@ -1,4 +1,4 @@
-锘縰sing System.Collections.Generic;
+using System.Collections.Generic;
 using UnityEngine;
 using System;
 
@@ -15,6 +15,9 @@
     private List<int> dontDestoryGoInstIDList = null;
 
     private Transform m_TargetContainer;
+
+    //闇�瑕佸姩鎬佸嵏杞界殑棰勫埗浣擄紝渚嬪鍒囨崲鍦烘櫙鏃�
+    public List<GameObject> needDestroyPrefabList = new List<GameObject>();
 
     public void Initialize()
     {
@@ -108,17 +111,17 @@
         return RequestPool(prefab).Request();
     }
 
-
+    //鐗瑰畾鎯呭喌涓嬮渶瑕佸姩鎬佸嵏杞界殑锛屽鍒囨崲鍦烘櫙鏃�
     public void UnLoadAll(bool force = false)
     {
         List<int> _removeList = new List<int>();
         foreach (var _pool in m_PoolDict.Values)
         {
-            // if (GAMgr.Instance.needDestroyPrefabList.Contains(_pool.Prefab))
-            // {
+            if (needDestroyPrefabList.Contains(_pool.Prefab))
+            {
                 _pool.Clear();
                 _removeList.Add(_pool.PrefabInstanceId);
-            // }
+            }
         }
 
         for (int i = 0; i < _removeList.Count; ++i)
@@ -137,13 +140,16 @@
                 return m_Prefab;
             }
         }
+
+        //棰勫埗浣撳疄渚媔d锛岀敤浜庢绱㈡睜
         public int PrefabInstanceId
         {
             get; private set;
         }
 
-        public List<GameObject> m_ActiveList = null;
-        private List<GameObject> m_FreeList = null;
+        public HashSet<GameObject> m_ActiveHashSet = new HashSet<GameObject>();
+        private Queue<GameObject> m_FreeQueue = null;
+        private int Pool_FreeList_Warning_Threshold = 8;
 
         Action<GameObject> releaseCallBack;
 #if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
@@ -159,8 +165,8 @@
         {
             m_Prefab = prefab;
             PrefabInstanceId = m_Prefab.GetInstanceID();
-            m_ActiveList = new List<GameObject>();
-            m_FreeList = new List<GameObject>();
+            m_ActiveHashSet = new HashSet<GameObject>();
+            m_FreeQueue = new Queue<GameObject>();
 
 #if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
             m_DebugContainer = new GameObject(prefab.name).transform;
@@ -188,11 +194,17 @@
             for (int i = 0; i < count; ++i)
             {
                 _go = Instantiate(m_Prefab, Constants.Special_Hide_Position, Quaternion.identity);
-                m_FreeList.Add(_go);
+                m_FreeQueue.Enqueue(_go);
                 _go.transform.SetParent(Instance.m_TargetContainer);
                 _go.transform.position = Constants.Special_Hide_Position;
 
+
 #if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+                // 妫�鏌ョ┖闂插垪琛ㄦ暟閲忔槸鍚﹁秴杩囬槇鍊�
+                if (m_FreeList.Count > Pool_FreeList_Warning_Threshold)
+                {
+                    Debug.LogWarning($"GameObjectPool {m_Prefab.name} 鐨勭┖闂插璞℃暟閲� ({m_FreeList.Count}) 瓒呰繃闃堝�� ({Pool_FreeList_Warning_Threshold})锛岃妫�鏌ユ槸鍚﹂渶瑕佹竻鐞嗐��");
+                }
 
                 DebugItem _debugItem = new GameObject(_go.GetInstanceID().ToString()).AddMissingComponent<DebugItem>();
                 _debugItem.transform.SetParent(m_DebugFree);
@@ -212,34 +224,26 @@
         {
             GameObject _go = null;
 
-            while (m_FreeList.Count > 0)
+            if (m_FreeQueue.Count > 0)
             {
-                if (m_FreeList[0] != null)
-                {
-                    _go = m_FreeList[0];
+                _go = m_FreeQueue.Dequeue();
 
-                    m_ActiveList.Add(_go);
-                    m_FreeList.RemoveAt(0);
+                m_ActiveHashSet.Add(_go);
 
 #if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
-                    if (Instance.m_DebugInstIDDict.ContainsKey(_go.GetInstanceID()))
-                    {
-                        DebugItem _debugItem = Instance.m_DebugInstIDDict[_go.GetInstanceID()];
-                        _debugItem.transform.SetParent(m_DebugActive);
-                    }
-#endif
-                    break;
-                }
-                else
+                if (Instance.m_DebugInstIDDict.ContainsKey(_go.GetInstanceID()))
                 {
-                    m_FreeList.RemoveAt(0);
+                    DebugItem _debugItem = Instance.m_DebugInstIDDict[_go.GetInstanceID()];
+                    _debugItem.transform.SetParent(m_DebugActive);
                 }
+#endif
             }
+
 
             if (_go == null)
             {
                 _go = Instantiate(m_Prefab, Constants.Special_Hide_Position, Quaternion.identity);
-                m_ActiveList.Add(_go);
+                m_ActiveHashSet.Add(_go);
 
 #if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
                 DebugItem _debugItem = new GameObject(_go.GetInstanceID().ToString()).AddMissingComponent<DebugItem>();
@@ -261,20 +265,19 @@
             {
                 return;
             }
-            if (m_ActiveList.Contains(go))
-            {
-                m_ActiveList.Remove(go);
-            }
-            if (m_FreeList.Contains(go))
-            {
-                return;
-            }
+            m_ActiveHashSet.Remove(go);
 
-            m_FreeList.Add(go);
+            m_FreeQueue.Enqueue(go);
             go.transform.SetParent(Instance.m_TargetContainer);
             go.transform.position = Constants.Special_Hide_Position;
 
+
 #if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+            // 妫�鏌ョ┖闂插垪琛ㄦ暟閲忔槸鍚﹁秴杩囬槇鍊�
+            if (m_FreeList.Count > Pool_FreeList_Warning_Threshold)
+            {
+                Debug.LogWarning($"GameObjectPool {m_Prefab.name} 鐨勭┖闂插璞℃暟閲� ({m_FreeList.Count}) 瓒呰繃闃堝�� ({Pool_FreeList_Warning_Threshold})锛岃妫�鏌ユ槸鍚﹂渶瑕佹竻鐞嗐��");
+            }
             if (Instance.m_DebugInstIDDict.ContainsKey(go.GetInstanceID()))
             {
                 DebugItem _debugItem = Instance.m_DebugInstIDDict[go.GetInstanceID()];
@@ -290,75 +293,75 @@
 
         public void ReleaseAll()
         {
-            for (int i = m_ActiveList.Count - 1; i >= 0; i--)
+            //閲婃斁 m_ActiveHashSet涓� 鐨凣ameObject锛屾帓闄�
+            foreach (GameObject go in m_ActiveHashSet)
             {
-                var _go = m_ActiveList[i];
-                m_ActiveList.Remove(_go);
-
-                if (!m_FreeList.Contains(_go))
+                if (go != null)
                 {
-                    m_FreeList.Add(_go);
-                }
+                    m_FreeQueue.Enqueue(go);
+                    go.transform.SetParent(Instance.m_TargetContainer);
+                    go.transform.position = Constants.Special_Hide_Position;
 
 #if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
-                DebugItem _debugItem = Instance.m_DebugInstIDDict[_go.GetInstanceID()];
-                _debugItem.transform.SetParent(m_DebugFree);
+                    if (Instance.m_DebugInstIDDict.ContainsKey(go.GetInstanceID()))
+                    {
+                        DebugItem _debugItem = Instance.m_DebugInstIDDict[go.GetInstanceID()];
+                        _debugItem.transform.SetParent(m_DebugFree);
+                    }
 #endif
-                _go.transform.SetParent(Instance.m_TargetContainer);
-                _go.transform.position = Constants.Special_Hide_Position;
-
-                if (releaseCallBack != null)
-                {
-                    releaseCallBack(_go);
+                    if (releaseCallBack != null)
+                    {
+                        releaseCallBack(go);
+                    }
                 }
+                
             }
+            m_ActiveHashSet.Clear();
         }
 
         public void Clear()
         {
-            for (int i = m_ActiveList.Count - 1; i >= 0; --i)
+            foreach (GameObject go in m_ActiveHashSet)
             {
-                if (m_ActiveList[i] == null
-                || Instance.dontDestoryGoInstIDList.Contains(m_ActiveList[i].GetInstanceID()))
-                    continue;
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
-                Destroy(Instance.m_DebugInstIDDict[m_ActiveList[i].GetInstanceID()].gameObject);
-#endif
-                Destroy(m_ActiveList[i]);
-                m_ActiveList.RemoveAt(i);
-            }
-
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
-            if (m_ActiveList.Count != 0)
-            {
-                Debug.LogWarningFormat("{0} 姹犳竻鐞嗗悗, 杩樻湁 {1} 涓椿璺冨璞�. ", m_Prefab.name, m_ActiveList.Count);
-                for (int i = 0; i < m_ActiveList.Count; ++i)
+                if (go != null)
                 {
-                    Debug.LogWarningFormat(" |-- {0}", m_ActiveList[i].name);
+                    if (!Instance.dontDestoryGoInstIDList.Contains(go.GetInstanceID()))
+                    {
+                        m_ActiveHashSet.Remove(go);
+                        Destroy(go);
+                    }
+
                 }
+                
+            }
+
+#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+            if (m_ActiveHashSet.Count != 0)
+            {
+                Debug.LogWarningFormat("{0} 姹犳竻鐞嗗悗, 杩樻湁 {1} 涓椿璺冨璞�. ", m_Prefab.name, m_ActiveHashSet.Count);
             }
 #endif
 
-            for (int i = m_FreeList.Count - 1; i >= 0; --i)
+            Queue<GameObject> tempQueue = new Queue<GameObject>();
+            while (m_FreeQueue.Count > 0)
             {
-                if (m_FreeList[i] == null
-                 || Instance.dontDestoryGoInstIDList.Contains(m_FreeList[i].GetInstanceID()))
-                    continue;
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
-                Destroy(Instance.m_DebugInstIDDict[m_FreeList[i].GetInstanceID()].gameObject);
-#endif
-                Destroy(m_FreeList[i]);
-                m_FreeList.RemoveAt(i);
+                GameObject obj = m_FreeQueue.Dequeue();
+                if (Instance.dontDestoryGoInstIDList.Contains(obj.GetInstanceID()))
+                    tempQueue.Enqueue(obj);
+                else
+                    Destroy(obj);
             }
+            m_FreeQueue = tempQueue;
+
 
 #if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
             if (m_FreeList.Count != 0)
             {
                 Debug.LogWarningFormat("{0} 姹犳竻鐞嗗悗, 杩樻湁 {1} 涓┖闂插璞�. ", m_Prefab.name, m_FreeList.Count);
-                for (int i = 0; i < m_FreeList.Count; ++i)
-                {
-                    Debug.LogWarningFormat(" |-- {0}", m_FreeList[i].name);
-                }
+                // for (int i = 0; i < m_FreeList.Count; ++i)
+                // {
+                //     Debug.LogWarningFormat(" |-- {0}", m_FreeList[i].name);
+                // }
             }
 #endif
             if (IsEmpty())
@@ -372,13 +375,13 @@
             if (!string.IsNullOrEmpty(assetBundleName) && !string.IsNullOrEmpty(assetName))
             {
                 ResManager.Instance.UnloadAsset(assetBundleName, assetName);
-                ResManager.Instance.UnloadAssetBundle(assetBundleName, true, false);
+                // ResManager.Instance.UnloadAssetBundle(assetBundleName, true, false);
             }
         }
 
         public bool IsEmpty()
         {
-            return m_ActiveList.Count == 0 && m_FreeList.Count == 0;
+            return m_ActiveHashSet.Count == 0 && m_FreeQueue.Count == 0;
         }
     }
 }

--
Gitblit v1.8.0