You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
2.8 KiB
106 lines
2.8 KiB
using UnityEngine; |
|
using System.Collections.Generic; |
|
using FairyGUI.Utils; |
|
|
|
namespace FairyGUI |
|
{ |
|
/// <summary> |
|
/// GObjectPool is use for GObject pooling. |
|
/// </summary> |
|
public class GObjectPool |
|
{ |
|
/// <summary> |
|
/// Callback function when a new object is creating. |
|
/// </summary> |
|
/// <param name="obj"></param> |
|
public delegate void InitCallbackDelegate(GObject obj); |
|
|
|
/// <summary> |
|
/// Callback function when a new object is creating. |
|
/// </summary> |
|
public InitCallbackDelegate initCallback; |
|
|
|
Dictionary<string, Queue<GObject>> _pool; |
|
Transform _manager; |
|
|
|
/// <summary> |
|
/// 需要设置一个manager,加入池里的对象都成为这个manager的孩子 |
|
/// </summary> |
|
/// <param name="manager"></param> |
|
public GObjectPool(Transform manager) |
|
{ |
|
_manager = manager; |
|
_pool = new Dictionary<string, Queue<GObject>>(); |
|
} |
|
|
|
/// <summary> |
|
/// Dispose all objects in the pool. |
|
/// </summary> |
|
public void Clear() |
|
{ |
|
foreach (KeyValuePair<string, Queue<GObject>> kv in _pool) |
|
{ |
|
Queue<GObject> list = kv.Value; |
|
foreach (GObject obj in list) |
|
obj.Dispose(); |
|
} |
|
_pool.Clear(); |
|
} |
|
|
|
/// <summary> |
|
/// |
|
/// </summary> |
|
public int count |
|
{ |
|
get { return _pool.Count; } |
|
} |
|
|
|
/// <summary> |
|
/// |
|
/// </summary> |
|
/// <param name="url"></param> |
|
/// <returns></returns> |
|
public GObject GetObject(string url) |
|
{ |
|
url = UIPackage.NormalizeURL(url); |
|
if (url == null) |
|
return null; |
|
|
|
Queue<GObject> arr; |
|
if (_pool.TryGetValue(url, out arr) |
|
&& arr.Count > 0) |
|
return arr.Dequeue(); |
|
|
|
GObject obj = UIPackage.CreateObjectFromURL(url); |
|
if (obj != null) |
|
{ |
|
if (initCallback != null) |
|
initCallback(obj); |
|
} |
|
|
|
return obj; |
|
} |
|
|
|
/// <summary> |
|
/// |
|
/// </summary> |
|
/// <param name="obj"></param> |
|
public void ReturnObject(GObject obj) |
|
{ |
|
if (obj.displayObject.isDisposed) |
|
return; |
|
|
|
string url = obj.resourceURL; |
|
Queue<GObject> arr; |
|
if (!_pool.TryGetValue(url, out arr)) |
|
{ |
|
arr = new Queue<GObject>(); |
|
_pool.Add(url, arr); |
|
} |
|
|
|
if (_manager != null) |
|
obj.displayObject.cachedTransform.SetParent(_manager, false); |
|
arr.Enqueue(obj); |
|
} |
|
} |
|
}
|
|
|