/// <summary> /// 清空对象池 /// </summary> public void ClearCache() { List <uint> tempList = new List <uint>(); foreach (uint key in m_ObjectPoolDic.Keys) { List <ResourceObj> st = m_ObjectPoolDic[key]; for (int i = st.Count - 1; i >= 0; i--) { ResourceObj resObj = st[i]; if (!System.Object.ReferenceEquals(resObj.m_CloneObj, null) && resObj.m_bClear) { GameObject.Destroy(resObj.m_CloneObj); m_ResourceObjDic.Remove(resObj.m_CloneObj.GetInstanceID()); resObj.Reset(); m_ResourceObjClassPool.Recycle(resObj); } } if (st.Count <= 0) { tempList.Add(key); } } for (int i = 0; i < tempList.Count; i++) { uint temp = tempList[i]; if (m_ObjectPoolDic.ContainsKey(temp)) { m_ObjectPoolDic.Remove(temp); } } tempList.Clear(); }
/// <summary> /// 清除某个资源在对象池中所有的对象 /// </summary> /// <param name="crc"></param> public void ClearPoolObject(uint crc) { List <ResourceObj> st = null; if (!m_ObjectPoolDic.TryGetValue(crc, out st) || st == null) { return; } for (int i = st.Count - 1; i >= 0; i--) { ResourceObj resObj = st[i]; if (resObj.m_bClear) { st.Remove(resObj); int tempID = resObj.m_CloneObj.GetInstanceID(); GameObject.Destroy(resObj.m_CloneObj); resObj.Reset(); m_ResourceObjDic.Remove(tempID); m_ResourceObjClassPool.Recycle(resObj); } } if (st.Count <= 0) { m_ObjectPoolDic.Remove(crc); } }
public override void Reset() { foreach (var ResourceObj in ActiveResources) //this will clear all the instances: TODO: possibly implement new method on modules to free memory (if needed) { ResourceObj.Reset(); } }
/// <summary> /// 清楚资源池缓存 /// </summary> public void ClearCache() { List <uint> tempList = new List <uint>(); foreach (uint crc in m_ObjectPoolDic.Keys) { List <ResourceObj> resObjs = m_ObjectPoolDic[crc]; for (int i = resObjs.Count - 1; i >= 0; i--) { ResourceObj item = resObjs[i]; if (!System.Object.ReferenceEquals(item, null) && resObjs[i].m_bClear) { GameObject.Destroy(item.m_CloneObj); m_ResourceObjDic.Remove(item.m_CloneObj.GetInstanceID()); item.Reset(); m_ResourceObjClassPool.Recycle(item); resObjs.Remove(item); } } if (resObjs.Count <= 0) { tempList.Add(crc); } } for (int i = 0; i < tempList.Count; i++) { if (m_ObjectPoolDic.ContainsKey(tempList[i])) { m_ObjectPoolDic.Remove(tempList[i]); } } tempList.Clear(); }
/// <summary> /// 取消异步加载 /// </summary> /// <param name="guid"></param> public void CancleLoad(long guid) { ResourceObj resObj = null; if (m_AsyncResObjs.TryGetValue(guid, out resObj) && ResourceManager.Instance.CancleLoad(resObj)) { m_AsyncResObjs.Remove(guid); resObj.Reset(); m_ResourceObjClassPool.Recycle(resObj); } }
/// <summary> /// 资源释放 /// </summary> /// <param name="obj">释放对象</param> /// <param name="maxCacheCount">最大缓冲数量,默认-1无限数量</param> /// <param name="destroyCache">是否清理掉缓存,默认否</param> /// <param name="recycleParent">是否重新放回到回收节点下</param> public void ReleaseObject(GameObject obj, int maxCacheCount = -1, bool destroyCache = false, bool recycleParent = true) { if (System.Object.ReferenceEquals(obj, null)) { return; } ResourceObj resObj = null; int tempID = obj.GetInstanceID(); if (!m_ResourceObjDic.TryGetValue(tempID, out resObj)) { Debug.Log(obj.name + "对象不是ObjectManager创建的!"); return; } if (resObj == null) { Debug.LogError("缓存的Resourceobj为空"); } if (resObj.m_Already) { Debug.LogError("该对象已经放回对象池了,检查自己是否清空引用!"); return; } #if UNITY_EDITOR obj.name += "(Recycle)"; #endif List <ResourceObj> st = null; if (maxCacheCount == 0) { m_ResourceObjDic.Remove(tempID); ResourceManager.Instance.ReleaseResource(resObj, destroyCache); resObj.Reset(); m_ResourceObjClassPool.Recycle(resObj); } else { if (!m_ObjectPoolDic.TryGetValue(resObj.m_Crc, out st) || st == null) { st = new List <ResourceObj>(); m_ObjectPoolDic.Add(resObj.m_Crc, st); } if (resObj.m_CloneObj) { if (recycleParent) { resObj.m_CloneObj.transform.SetParent(RecyclePoolTrs); } else { resObj.m_CloneObj.SetActive(false); } } if (maxCacheCount < 0 || st.Count < maxCacheCount) { st.Add(resObj); resObj.m_Already = true; ResourceManager.Instance.DecreaseResourceRes(resObj); } else { m_ResourceObjDic.Remove(tempID); ResourceManager.Instance.ReleaseResource(resObj, destroyCache); resObj.Reset(); m_ResourceObjClassPool.Recycle(resObj); } } }
/// <summary> /// 资源释放 /// </summary> /// <param name="obj">删除的游戏对象</param> /// <param name="maxCacheCount">最大缓存个数,-1代表不限</param> /// <param name="destoryCache">是否需要缓存</param> /// <param name="recycleParent">回收的gameobject是否回收到回收节点下</param> public void ReleaseObject(GameObject obj, int maxCacheCount = -1, bool destoryCache = false, bool recycleParent = true) { if (obj == null) { return; } long tempID = obj.GetInstanceID(); ResourceObj resObj = null; if (!m_ResourceObjDic.TryGetValue(tempID, out resObj)) { Debug.Log(obj.name + "对象不是ObjectManger创建的!"); return; } if (resObj == null) { Debug.Log("缓存的resouceObj为空"); return; } if (resObj.m_Already) { Debug.Log("该对象已被回收,检测是否清空引用!"); return; } #if UNITY_EDITOR obj.name += "(Recycle)"; #endif if (maxCacheCount == 0) { m_ResourceObjDic.Remove(tempID); ResourceManger.Instance.ReleaseResouce(resObj, destoryCache); //资源回收 resObj.Reset(); m_ResourceObjClassPool.Recycle(resObj); } else { List <ResourceObj> objList = null; //回收到对象池 if (!m_ObjectPoolDic.TryGetValue(resObj.m_Crc, out objList) || objList == null) { objList = new List <ResourceObj>(); m_ObjectPoolDic.Add(resObj.m_Crc, objList); } if (resObj.m_CloneObj != null) { if (recycleParent) { resObj.m_CloneObj.transform.SetParent(RecyclePoolTrs);//回收到回收节点 } else { resObj.m_CloneObj.SetActive(false);//隐藏 } } //如果缓存个数没达到上限则添加缓存 if (maxCacheCount < 0 || objList.Count < maxCacheCount) { objList.Add(resObj); resObj.m_Already = true; //resMgr引用计数 ResourceManger.Instance.DecreaseResourceRef(resObj); } else { m_ResourceObjDic.Remove(tempID); ResourceManger.Instance.ReleaseResouce(resObj, destoryCache); //资源回收 resObj.Reset(); m_ResourceObjClassPool.Recycle(resObj); } } }