如果频繁创建对象,再销毁对象,会造成垃圾(失去引用的对象)过多,进而让GC的次数变多。因此设计了一个简单的缓存池,将本应该销毁的对象放入其中,下次使用时,直接冲缓存池取出,便可使用。此过程是用内存来换性能。因为多次GC后这些因为对象长时间存在,最终会被转移到2代内存中去。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PoolData
{
//抽屉中所有元素的父对象
public GameObject fatherObj;
//抽屉
public List<GameObject> poolList;
//初始化 抽屉以及抽屉的父对象
public PoolData(GameObject obj,GameObject poolObj)
{
fatherObj=new GameObject(obj.name);
fatherObj.transform.parent=poolObj.transform;
poolList=new List<GameObject>(){obj};
}
//往抽屉放入一个对象
public void PushObj(GameObject obj)
{
//失活
obj.SetActive(false);
//往抽屉里添加元素
poolList.Add(obj);
//设置父对象
obj.transform.parent = fatherObj.transform;
}
//从抽屉取出一个对象
public GameObject GetObj()
{
GameObject obj = null;
obj = poolList[0];
//从列表中移除
poolList.RemoveAt(0);
obj.SetActive(true);
//断绝父子关系
obj.transform.parent=null;
return obj;
}
}
public class PoolMrg :BaseManager<PoolMrg>
{
public Dictionary<string,PoolData> poolDic=new Dictionary<string, PoolData>();
//缓存池根对象
GameObject poolObj=null;
//获取某个抽屉里的游戏对象(根据名称)
public GameObject GetObj(string name)
{
GameObject obj=null;
//存在
if(poolDic.ContainsKey(name)&&poolDic[name].poolList.Count>0)
{
obj=poolDic[name].GetObj();
}
//不存在 实例化一个
else
{
obj=GameObject.Instantiate(Resources.Load<GameObject>(name));
obj.name=name;
}
return obj;
}
//放入缓存池的某个抽屉
public void PushObj(string name,GameObject obj)
{
//缓存池根对象不存在 就创建一个
if(poolObj==null)
poolObj=new GameObject("Pool");
//存在对应抽屉 就将对象放入抽屉
if(poolDic.ContainsKey(name))
{
poolDic[name].PushObj(obj);
}
//不存在就创建一个抽屉
else
{
poolDic.Add(name,new PoolData(obj,poolObj));
}
}
public void Clear()
{
poolObj=null;
poolDic.Clear();
}
}