Ejemplo n.º 1
0
        /// <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_ResObjDic.Remove(tempID);
                    m_ResObjClassPool.Recycle(resObj);
                }
            }

            if (st.Count == 0)
            {
                m_ObjectPoolDic.Remove(crc);
            }
        }
Ejemplo n.º 2
0
        /// <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_ResObjDic.Remove(resObj.m_CloneObj.GetInstanceID());
                        resObj.Reset();
                        m_ResObjClassPool.Recycle(resObj);
                        st.Remove(resObj);
                    }
                }

                if (st.Count <= 0)
                {
                    tempList.Add(key);
                }
            }

            for (int i = 0; i < tempList.Count; i++)
            {
                if (m_ObjectPoolDic.ContainsKey(tempList[i]))
                {
                    m_ObjectPoolDic.Remove(tempList[i]);
                }
            }
            tempList.Clear();
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 取消异步加载
        /// </summary>
        /// <param name="guid"></param>
        public void CancleLoad(long guid)
        {
            ResourceObj resObj = null;

            //根据GUID,找到正在异步加载的资源,并且该资源没有在加载中,回调列表数量是0
            if (m_AsyncResObjs.TryGetValue(guid, out resObj) && ResourceManager.Instance.CancleLoad(resObj))
            {
                m_AsyncResObjs.Remove(guid);

                resObj.Reset();
                m_ResObjClassPool.Recycle(resObj);
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 回收资源
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="maxCacheCount"></param>
        /// <param name="destoryCache"></param>
        /// <param name="recycleParent">是否放回回收节点</param>
        public void ReleaseObject(GameObject obj, int maxCacheCount = -1, bool destoryCache = false, bool recycleParent = true)
        {
            if (obj == null)
            {
                return;
            }

            ResourceObj resObj = null;

            int temID = obj.GetInstanceID();

            if (!m_ResObjDic.TryGetValue(temID, 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_ResObjDic.Remove(temID);

                ResourceManager.Instance.ReleaseResource(resObj, destoryCache);

                resObj.Reset();

                m_ResObjClassPool.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做一个引用计数
                    ResourceManager.Instance.DecreaseResourceRef(resObj);
                }
                else
                {
                    m_ResObjDic.Remove(temID);
                    ResourceManager.Instance.ReleaseResource(resObj, destoryCache);
                    resObj.Reset();
                    m_ResObjClassPool.Recycle(resObj);
                }
            }
        }