Unity中对象池的使用

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 }

 

posted @ 2017-05-19 14:18  AaronBlogs  阅读(553)  评论(0编辑  收藏  举报