Esempio n. 1
0
        //清空对象池
        public void ClearCache()
        {
            List <uint> tempList = new List <uint>();

            foreach (uint key in m_gameObjectItemPoolDict.Keys)
            {
                List <GameObjectItem> list = m_gameObjectItemPoolDict[key];
                for (int i = list.Count - 1; i >= 0; --i)
                {
                    GameObjectItem item = list[i];
                    if (System.Object.ReferenceEquals(item.Obj, null) && item.Clear)
                    {
                        list.Remove(item);
                        GameObject.Destroy(item.Obj);
                        m_gameObjectItemDict.Remove(item.Obj.GetInstanceID());
                        item.Reset();
                        m_gameObjectItemClassPool.Recycle(item);
                    }
                }
                if (list.Count <= 0)
                {
                    tempList.Add(key);
                }
            }
            for (int i = 0; i < tempList.Count; i++)
            {
                uint temp = tempList[i];
                if (m_gameObjectItemPoolDict.ContainsKey(temp))
                {
                    m_gameObjectItemPoolDict.Remove(temp);
                }
            }
            tempList.Clear();
            tempList = null;
        }
Esempio n. 2
0
        //清除某个资源在对象池中的所有对象
        public void ClearPoolObject(uint crc)
        {
            List <GameObjectItem> st = null;

            if (m_gameObjectItemPoolDict.TryGetValue(crc, out st) == false || st == null)
            {
                return;
            }
            for (int i = st.Count - 1; i >= 0; --i)
            {
                GameObjectItem item = st[i];
                if (item.Clear)
                {
                    st.Remove(item);
                    int tempId = item.Obj.GetInstanceID();
                    GameObject.Destroy(item.Obj);
                    item.Reset();
                    m_gameObjectItemDict.Remove(tempId);
                    m_gameObjectItemClassPool.Recycle(item);
                }
            }
            if (st.Count <= 0)
            {
                m_gameObjectItemPoolDict.Remove(crc);
            }
        }
Esempio n. 3
0
        //取消某个GameObject的异步加载
        public void CancelAsyncLoad(long guid)
        {
            GameObjectItem item = null;

            if (m_asyncGameObjectItemDict.TryGetValue(guid, out item) && item != null && ResourceMgr.Instance.CancelAsyncLoad(item))
            {
                m_asyncGameObjectItemDict.Remove(guid);
                item.Reset();
                m_gameObjectItemClassPool.Recycle(item);
            }
        }
Esempio n. 4
0
        //卸载资源
        public void ReleaseGameObjectItem(GameObject obj, int maxCacheCount = -1,
                                          bool destoryCache = false, bool recycleParent = true)
        {
            if (obj == null)
            {
                return;
            }
            GameObjectItem gameObjectItem = null;
            int            tempGuid       = obj.GetInstanceID();

            if (!m_gameObjectItemDict.TryGetValue(tempGuid, out gameObjectItem) || gameObjectItem == null)
            {
                Debug.Log(obj.name + "并非对象池技术创建,不能回收到对象池!");
                return;
            }
            if (gameObjectItem.AlreadyRelease)
            {
                Debug.LogError(obj.name + "该对象已经放回对象池, 检查是否清空该对象的引用!");
                return;
            }
#if UNITY_EDITOR
            obj.name += "(Recycle)";
#endif
            if (maxCacheCount == 0) //表示不缓存
            {
                m_gameObjectItemDict.Remove(tempGuid);
                GameObject.Destroy(gameObjectItem.Obj);
                ResourceMgr.Instance.UnLoadGameObjectItem(gameObjectItem, destoryCache);
                gameObjectItem.Reset();
                m_gameObjectItemClassPool.Recycle(gameObjectItem);
            }
            else
            {
                //回收到对象池
                List <GameObjectItem> list = null;
                if (!m_gameObjectItemPoolDict.TryGetValue(gameObjectItem.Crc, out list) || list == null)
                {
                    list = new List <GameObjectItem>();
                    m_gameObjectItemPoolDict.Add(gameObjectItem.Crc, list);
                }
                if (gameObjectItem.Obj)
                {
                    if (recycleParent)
                    {
                        gameObjectItem.Obj.transform.SetParent(m_goPool);
                    }
                    else
                    {
                        gameObjectItem.Obj.SetActive(false);
                    }
                }
                if (maxCacheCount < 0 || list.Count < maxCacheCount) //<0表示可以无限缓存, <maxCacheCount表示需要放入缓存
                {
                    list.Add(gameObjectItem);
                    gameObjectItem.AlreadyRelease = true;
                    ResourceMgr.Instance.DecrementResourceRef(gameObjectItem, 1);
                }
                else //不需要缓存GameObject到对象池
                {
                    m_gameObjectItemDict.Remove(tempGuid);
                    GameObject.Destroy(gameObjectItem.Obj);
                    ResourceMgr.Instance.UnLoadGameObjectItem(gameObjectItem);
                    gameObjectItem.Reset();
                    m_gameObjectItemClassPool.Recycle(gameObjectItem);
                }
            }
        }