using System.Collections.Generic; using UnityEngine; namespace XericUI.VisualForm { /// /// 窗口实例对象池 - 管理预制体实例的复用,减少频繁的创建和销毁开销 /// public static class WindowPool { /// /// 待命字典:键为预制体原型引用,值为隐藏的待复用实例队列 /// private static readonly Dictionary> s_StandbyDict = new Dictionary>(); /// /// 从对象池获取一个实例。如果池中有则复用,否则实例化新的 /// /// 预制体原型 /// 父级Transform /// 获取到的实例 public static GameObject Get(GameObject prefab, Transform parent) { if (prefab == null) { Debug.LogError("[WindowPool] 预制体为空,无法获取实例"); return null; } if (s_StandbyDict.TryGetValue(prefab, out var queue) && queue.Count > 0) { var instance = queue.Dequeue(); if (instance != null) { instance.transform.SetParent(parent, false); instance.SetActive(true); return instance; } } // 池中无可用实例,创建新的 var newInstance = Object.Instantiate(prefab, parent, false); newInstance.name = prefab.name; return newInstance; } /// /// 将实例回收到对象池中 /// /// 预制体原型 /// 要回收的实例 public static void Release(GameObject prefab, GameObject instance) { if (prefab == null || instance == null) return; instance.SetActive(false); if (!s_StandbyDict.TryGetValue(prefab, out var queue)) { queue = new Queue(); s_StandbyDict[prefab] = queue; } queue.Enqueue(instance); } /// /// 清空指定预制体的对象池 /// /// 预制体原型 public static void Clear(GameObject prefab) { if (prefab == null) return; if (s_StandbyDict.TryGetValue(prefab, out var queue)) { while (queue.Count > 0) { var instance = queue.Dequeue(); if (instance != null) Object.Destroy(instance); } s_StandbyDict.Remove(prefab); } } /// /// 清空所有对象池 /// public static void ClearAll() { foreach (var kvp in s_StandbyDict) { while (kvp.Value.Count > 0) { var instance = kvp.Value.Dequeue(); if (instance != null) Object.Destroy(instance); } } s_StandbyDict.Clear(); } /// /// 检查指定预制体在池中是否有可用实例 /// /// 预制体原型 /// 是否有可用实例 public static bool HasAvailable(GameObject prefab) { return prefab != null && s_StandbyDict.TryGetValue(prefab, out var queue) && queue.Count > 0; } } }