Example #1
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_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();
    }
Example #2
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_ResourceObjDic.Remove(tempID);
                m_ResourceObjClassPool.Recycle(resObj);
            }
        }
        if (st.Count <= 0)
        {
            m_ObjectPoolDic.Remove(crc);
        }
    }
Example #3
0
 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();
     }
 }
Example #4
0
    /// <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();
    }
Example #5
0
    /// <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);
        }
    }
Example #6
0
    /// <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);
            }
        }
    }
Example #7
0
    /// <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);
            }
        }
    }