unity中用到大量重复的物体,例如发射的子弹,可以引入对象池来管理,优化内存。
对象池使用的基本思路是:
将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用。恰当地使用对象池,可以在一定程度上减少频繁创建对象所造成的开销。
并非所有对象都适合拿来池化――因为维护对象池也要造成一定开销。对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况。
代码如下所示:
1 using UnityEngine; 2 using System.Collections; 3 using System.Collections.Generic; 4 5 public class GameObjectPool : MonoBehaviour { 6 //单例模式 7 private static GameObjectPool instance; 8 9 public static GameObjectPool Instance 10 { 11 get { return GameObjectPool.instance; } 12 set { GameObjectPool.instance = value; } 13 } 14 15 private static Dictionary<string, ArrayList> pool = new Dictionary<string, ArrayList>{ }; 16 // Use this for initialization 17 void Start () 18 { 19 Instance = this; 20 } 21 public static Object Get(string prefabName, Vector3 position, Quaternion rotation) 22 { 23 string key = prefabName + "(Clone)"; 24 Object o; 25 //池中存在,则从池中取出 26 if (pool.ContainsKey(key) && pool[key].Count>0) 27 { 28 ArrayList list=pool[key]; 29 o=list[0] as Object; 30 list.Remove(o); 31 //重新初始化相关状态 32 (o as GameObject).SetActive(true); 33 (o as GameObject).transform.position = position; 34 (o as GameObject).transform.rotation = rotation; 35 } 36 //池中没有则实例化gameobejct 37 else 38 { 39 o = Instantiate(Resources.Load(prefabName),position,rotation); 40 } 41 return o; 42 } 43 44 45 public static Object Return(GameObject o) 46 { 47 string key = o.name; 48 if (pool.ContainsKey(key)) 49 { 50 ArrayList list=pool[key]; 51 list.Add(o); 52 } 53 else 54 { 55 pool[key] = new ArrayList(){ o}; 56 } 57 o.SetActive(false); 58 return o; 59 } 60 }