Ejemplo n.º 1
0
        /// <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);
            }
        }
Ejemplo n.º 2
0
        /// <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();
        }
Ejemplo n.º 3
0
        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);
        }