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