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