关于对象池,引用百度上的一句话:对象池使用的基本思路是:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,从而在一定程度上减少频繁创建对象所造成的开销。</span>
简单的来说就是: 重复利用对象,减少创建和销毁对象的性能消耗
{
//实例池对象
private static GameObject poolParent;
public override void Init()
{
//初始化实例池
poolParent = new GameObject();
poolParent.name = "Pool";
poolParent.SetActive(false);
GameObject.DontDestroyOnLoad(poolParent);
}
//池里对象字典
private Dictionary<string, List<GameObject>> pool = new Dictionary<string, List<GameObject>>();
//出池 对象名+路径
public GameObject OnGetObj(string objName,string path = null)
{
if (path != null)
{
if (!path.Contains("/"))
{
path += "/";
}
}
//如果不存在池里,加载生成
if (!pool.ContainsKey(objName) || pool[objName].Count == 0)
{
if(path == null)
{
Debug.LogError("Obj Pool doens't have : " + objName);
return null;
}
//使用资源管理器
//250000 效率
GameObject go = null;
go = ResManager.Instance.LoadInstance(path + objName) as GameObject;
//300000 效率
//GameObject go = null;
//ResManager.Instance.LoadAsyncInstance(path + objName, (_obj) => { go = _obj as GameObject; });
if (go == null)
Debug.LogError("Cannot find resource : " + path + objName);
//GameObject result = GameObject.Instantiate(go) as GameObject;
go.name = objName;
return go;
}
else
{
//否则从池里取出
GameObject result = pool[objName][0];
pool[objName].RemoveAt(0);
//result.transform.localPosition = Vector3.zero;
//result.transform.localRotation = Quaternion.Euler(Vector3.zero);
if(result.transform.parent != poolParent.transform)
{
Debug.LogError("obj not in Pool : " + result);
}
result.transform.SetParent(null);
return result;
}
}
//进池
public void OnReturnObj(GameObject go)
{
if(go.transform.parent == poolParent.transform)
{
return;
}
//如果池里没有此类对象,新建一个List
if(!pool.ContainsKey(go.name))
{
pool.Add(go.name, new List<GameObject>());
}
go.transform.SetParent(poolParent.transform);
pool[go.name].Add(go);
}
public void OnDestroy()
{
pool.Clear();
GameObject.Destroy(poolParent.gameObject);
}
}