/// <summary> /// 清除某个资源在对象池中所有的对象 /// </summary> /// <param name="crc"></param> public void ClearPoolObject(uint crc) { List <ResObject> st = null; if (!mObjectPoolDic.TryGetValue(crc, out st) || st == null) { return; } for (int i = st.Count - 1; i >= 0; i--) { ResObject resObj = st[i]; if (resObj.mClear) { st.Remove(resObj); int tempID = resObj.mCloneObj.GetInstanceID(); GameObject.Destroy(resObj.mCloneObj); resObj.Recycle2Cache(); mResouceObjDic.Remove(tempID); SafeObjectPool <ResObject> .Instance.Recycle(resObj); } } if (st.Count <= 0) { mObjectPoolDic.Remove(crc); } }
/// <summary> /// 清空对象池 /// </summary> public void ClearCache() { List <uint> tempList = new List <uint>(); foreach (uint key in mObjectPoolDic.Keys) { List <ResObject> st = mObjectPoolDic[key]; for (int i = st.Count - 1; i >= 0; i--) { ResObject resObj = st[i]; if (!System.Object.ReferenceEquals(resObj.mCloneObj, null) && resObj.mClear) { GameObject.Destroy(resObj.mCloneObj); mResouceObjDic.Remove(resObj.mCloneObj.GetInstanceID()); resObj.Recycle2Cache(); st.Remove(resObj); } } if (st.Count <= 0) { tempList.Add(key); } } for (int i = 0; i < tempList.Count; i++) { uint temp = tempList[i]; if (mObjectPoolDic.ContainsKey(temp)) { mObjectPoolDic.Remove(temp); } } tempList.Clear(); }
public void ReleaseObj(int InstanceID, int maxCacheCount = -1, bool destoryCache = false, bool recycleParent = true) { ResObject resObject = mResouceObjDic[InstanceID]; if (mResouceObjDic[InstanceID].IsRecycled) { AFLogger.e(resObject.mCloneObj.name + "对象已经回收!"); return; } if (mResouceObjDic[InstanceID].IsRecyclePool) { AFLogger.e(resObject.mCloneObj.name + "对象已经放回对象池!"); return; } #if UNITY_EDITOR resObject.mCloneObj.name += "(Recycle)"; #endif //最大缓存数量为0 : 则销毁Gameobject并回收resObject if (maxCacheCount == 0) { ReleaseResouce(resObject.mResPath, destoryCache); DestroyImmediate(resObject.mCloneObj); resObject.Recycle2Cache(); } //回收到对象池 else { List <ResObject> st = null; if (!mObjectPoolDic.TryGetValue(resObject.mCrc, out st) || st == null) { st = new List <ResObject>(); mObjectPoolDic.Add(resObject.mCrc, st); } //回收到recycleTrs下 if (resObject.mCloneObj) { if (recycleParent) { resObject.mCloneObj.transform.SetParent(recycleTrs); } else { resObject.mCloneObj.SetActive(false); } } //是否缓存到最大值,-1是无限制缓存 if (maxCacheCount < 0 || st.Count < maxCacheCount) { st.Add(resObject); resObject.IsRecyclePool = true; //ResourceManager做一个引用计数 resObject.Release(); } else { ReleaseResouce(resObject.mResPath, destoryCache); DestroyImmediate(resObject.mCloneObj); resObject.Recycle2Cache(); } } mResouceObjDic.Remove(InstanceID); }