Example #1
0
    /// <summary>
    /// 清空对象池对该路径下的所有物体引用(用于ResourceManager释放资源的接口)
    /// </summary>
    public void ClearPoolObject(uint crc)
    {
        List <ResourceObject> resObjList = null;

        if (!m_ObjectResPoolDict.TryGetValue(crc, out resObjList) || resObjList == null)
        {
            return;
        }
        for (int i = resObjList.Count - 1; i >= 0; i--)
        {
            ResourceObject resObj = resObjList[i];
            if (resObj.m_IsClear && resObj.m_GameObj != null)
            {
                int guid = resObj.m_GameObj.GetInstanceID();
                GameObject.Destroy(resObj.m_GameObj);
                m_ResObjectDict.Remove(guid);
                resObj.Reset();
                m_ResObjPool.UnSpawn(resObj);
                resObjList.RemoveAt(i);
            }
        }
        if (resObjList.Count <= 0)
        {
            m_ObjectResPoolDict.Remove(crc);
        }
    }
Example #2
0
    /// <summary>
    /// 清除对象池缓存
    /// </summary>
    public void ClearCache()
    {
        List <uint> needClearCrcList = new List <uint>();

        foreach (uint crc in m_ObjectResPoolDict.Keys)
        {
            List <ResourceObject> tempList = m_ObjectResPoolDict[crc];
            for (int i = tempList.Count - 1; i >= 0; i--)
            {
                ResourceObject tempObj = tempList[i];
                if (!System.Object.ReferenceEquals(tempObj.m_GameObj, null) && tempObj.m_IsClear)
                {
                    tempList.RemoveAt(i);
                    m_ResObjectDict.Remove(tempObj.m_GameObj.GetInstanceID());
                    tempObj.Reset();
                    m_ResObjPool.UnSpawn(tempObj);
                }
            }
            if (tempList.Count <= 0)
            {
                needClearCrcList.Add(crc);
            }
        }
        for (int i = 0; i < needClearCrcList.Count; i++)
        {
            uint crc = needClearCrcList[i];
            if (m_ObjectResPoolDict.ContainsKey(crc))
            {
                m_ObjectResPoolDict.Remove(crc);
            }
        }
        needClearCrcList.Clear();
    }
Example #3
0
    /// <summary>
    /// 按GUID取消异步资源加载
    /// </summary>
    /// <param name="guid"></param>
    public void CalcelAsyncLoad(int guid)
    {
        ResourceObject resObj = null;

        if (m_AsyncResObjectDict.TryGetValue(guid, out resObj) && ResourceManager.Instance.CancelAsyncLoad(resObj))
        {
            m_AsyncResObjectDict.Remove(guid);
            resObj.Reset();
            m_ResObjPool.UnSpawn(resObj);
        }
    }
 public static void Release(ref ResourceObject resobj)
 {
     if (resobj.willReleaseObjs != null && ResourceCache.CanUseCustomUnloder())
     {
         for (int i = 0; i < resobj.willReleaseObjs.Length; i++)
         {
             Object.DestroyImmediate(resobj.willReleaseObjs[i], true);
             resobj.willReleaseObjs[i] = null;
         }
     }
     resobj.Reset();
     rymTPool <ResourceObject> .Release(ref resobj);
 }
Example #5
0
    /// <summary>
    /// 释放资源
    /// </summary>
    /// <param name="obj">游戏物体</param>
    /// <param name="maxCacheCount">最大缓存数,小于0:不限制,等于0:清除该类型资源</param>
    /// <param name="isDestoryCache">是否清除缓存</param>
    /// <param name="recycleParent">是否回收资源</param>
    public void ReleaseObject(GameObject obj, int maxCacheCount = -1, bool isDestoryCache = false, bool recycleParent = true)
    {
        if (obj == null)
        {
            return;
        }
        int            GUID   = obj.GetInstanceID();
        ResourceObject resObj = null;

        if (!m_ResObjectDict.TryGetValue(GUID, out resObj))
        {
            Debug.LogWarning(obj.name + "对象不是ObjectManager创建的!");
            return;
        }
        if (resObj == null)
        {
            Debug.LogError("缓存的ResourceObject为空!");
        }
        if (resObj.m_Already)
        {
            Debug.LogError("已经释放过该资源!" + obj.name);
        }
#if UNITY_EDITOR
        obj.name += "(recycle)";
#endif
        List <ResourceObject> resObjList = null;
        if (maxCacheCount == 0) //回收资源
        {
            m_ResObjectDict.Remove(GUID);
            ResourceManager.Instance.ReleaseResource(resObj, isDestoryCache);
            resObj.Reset();
            m_ResObjPool.UnSpawn(resObj);
        }
        else //回收进对象池
        {
            if (!m_ObjectResPoolDict.TryGetValue(resObj.m_Crc, out resObjList) || resObjList == null)
            {
                resObjList = new List <ResourceObject>();
                m_ObjectResPoolDict.Add(resObj.m_Crc, resObjList);
            }
            if (resObj.m_GameObj)
            {
                if (recycleParent)
                {
                    resObj.m_GameObj.transform.SetParent(m_UnSpawnParentNode);
                }
                else
                {
                    resObj.m_GameObj.SetActive(false);
                }
            }
            if (maxCacheCount < 0 || resObjList.Count < maxCacheCount)
            {
                resObjList.Add(resObj);
                resObj.m_Already = true;
                ResourceManager.Instance.DecreaseRef(resObj.m_Crc);
            }
            else
            {
                //回收
                m_ResObjectDict.Remove(GUID);
                ResourceManager.Instance.ReleaseResource(resObj, isDestoryCache);
                resObj.Reset();
                m_ResObjPool.UnSpawn(resObj);
            }
        }
    }