|  |  |  |  | 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); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } |