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 Instance10 {11 get { return GameObjectPool.instance; }12 set { GameObjectPool.instance = value; }13 }14 15 private static Dictionarypool = new Dictionary { };16 // Use this for initialization17 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 //池中没有则实例化gameobejct37 else38 {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 else54 {55 pool[key] = new ArrayList(){ o};56 }57 o.SetActive(false);58 return o;59 }60 }