Ejemplo n.º 1
0
        public static GameObject InstantiateObjectSync(ObjLoadInfo objLoadInfo)
        {
            //从对象池拿取对象
            ResObject resObject = ResManager.Instance.GetObjectFromPool(objLoadInfo.mCRC);

            //对象池没有
            if (resObject == null)
            {
                //ResManager提供加载方法
                resObject = ResourceLoader.Instance.LoadResSyncForObj(objLoadInfo);

                if (resObject.mObj != null)
                {
                    if (objLoadInfo.ObjParentTrans == null)
                    {
                        resObject.mCloneObj = GameObject.Instantiate(resObject.mObj) as GameObject;
                    }
                    else
                    {
                        resObject.mCloneObj = GameObject.Instantiate(resObject.mObj, objLoadInfo.ObjParentTrans) as GameObject;
                    }
                    ResManager.Instance.CacheResObj(resObject);
                }
            }
            else
            {
                resObject.mCloneObj.transform.SetParent(objLoadInfo.ObjParentTrans);
                ResManager.Instance.CacheResObj(resObject);
            }
            return(resObject.mCloneObj);
        }
Ejemplo n.º 2
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.º 3
0
 public void LoadObjCallBack(bool result, ResObject resObject)
 {
     if (result)
     {
         Obj.Add(resObject.mCloneObj);
     }
 }
Ejemplo n.º 4
0
        /// <summary>
        /// 从对象池取对象
        /// </summary>
        /// <param name="crc"></param>
        /// <returns></returns>
        public ResObject GetObjectFromPool(uint crc)
        {
            List <ResObject> st = null;

            if (mObjectPoolDic.TryGetValue(crc, out st) && st != null && st.Count > 0)
            {
                ResObject resObj = st[0];
                resObj.Retain();
                st.RemoveAt(0);
                GameObject obj = resObj.mCloneObj;
                if (!System.Object.ReferenceEquals(obj, null))
                {
                    resObj.IsRecyclePool = false;

#if UNITY_EDITOR
                    if (obj.name.EndsWith("(Recycle)"))
                    {
                        obj.name = obj.name.Replace("(Recycle)", "");
                    }
#endif
                }
                return(resObj);
            }
            return(null);
        }
Ejemplo n.º 5
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.º 6
0
        public static ResObject Allocate(ResInfo resInfo)
        {
            ResObject resObject = SafeObjectPool <ResObject> .Instance.Allocate();

            resObject.mClear        = resInfo.DestroyCache;
            resObject.mResPath      = resInfo.ResPath;
            resObject.IsRecyclePool = false;
            return(resObject);
        }
Ejemplo n.º 7
0
        public static ResObject Allocate(ObjLoadInfo objLoadInfo)
        {
            ResObject resObject = SafeObjectPool <ResObject> .Instance.Allocate();

            resObject.mCrc          = objLoadInfo.mCRC;
            resObject.mClear        = objLoadInfo.mClear;
            resObject.mResPath      = objLoadInfo.mResPath;
            resObject.IsRecyclePool = false;
            return(resObject);
        }
Ejemplo n.º 8
0
        public static ResObject Copy(ResObject resObject)
        {
            ResObject newResObject = SafeObjectPool <ResObject> .Instance.Allocate();

            newResObject.mObj          = resObject.mObj;
            newResObject.mClear        = resObject.mClear;
            newResObject.IsRecyclePool = resObject.IsRecyclePool;
            newResObject.IsRecycled    = resObject.IsRecycled;
            newResObject.RefCount      = resObject.RefCount;
            newResObject.mResPath      = resObject.mResPath;
            return(newResObject);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 异步加载Object
        /// </summary>
        /// <param name="objLoadInfo"></param>
        public static void InstantiateObjectASync(ObjLoadInfo objLoadInfo)
        {
            //从对象池拿取对象
            ResObject resObject = ResManager.Instance.GetObjectFromPool(objLoadInfo.mCRC);

            if (resObject == null)
            {
                //ResourceLoader加载资源
                ResourceLoader.Instance.LoadResAsyncForObj(objLoadInfo);
            }
            else
            {
                if (objLoadInfo.ObjParentTrans != null)
                {
                    resObject.mCloneObj.transform.SetParent(objLoadInfo.ObjParentTrans);
                }
                objLoadInfo.loadObjCall(true, resObject);
                objLoadInfo.Recycle2Cache();
            }
        }
Ejemplo n.º 10
0
        public void AsyncObjCallBack(bool LoadResult, ResInfo resInfo)
        {
            if (!LoadResult)
            {
                mAsyncLoadingObjDic.Remove(resInfo.ResPath);
                ResManager.Instance.RemoveLoadFailRes(resInfo.mCRC);
                resInfo.Recycle2Cache();
                mAsyncLoadingObjDic[resInfo.ResPath].ForEach((objLoadInfo) =>
                {
                    objLoadInfo.loadObjCall.InvokeGracefully(LoadResult, null);
                    objLoadInfo.Recycle2Cache();
                });
                mAsyncLoadingObjDic.Remove(resInfo.ResPath);
                return;
            }
            bool DestroyCache = false;

            mAsyncLoadingObjDic[resInfo.ResPath].ForEach((objLoadInfo) =>
            {
                ResObject resObject = ResObject.Allocate(objLoadInfo);
                resObject.mObj      = resInfo.ResObject;
                resObject.ABName    = resInfo.ABName;
                resObject.mCloneObj = GameObject.Instantiate(resObject.mObj, objLoadInfo.ObjParentTrans) as GameObject;
                mObjList.AddValue(resObject.mCloneObj.GetInstanceID());
                objLoadInfo.loadObjCall.InvokeGracefully(LoadResult, resObject);
                ResManager.Instance.CacheResObj(resObject);
                if (objLoadInfo.mClear)
                {
                    DestroyCache = true;
                }
                resObject.Retain();
                resInfo.Retain();
                objLoadInfo.Recycle2Cache();
            });
            resInfo.DestroyCache = DestroyCache;
            mAsyncLoadingObjDic.Remove(resInfo.ResPath);
        }
Ejemplo n.º 11
0
        public ResObject LoadResSyncForObj(ObjLoadInfo objLoadInfo)
        {
            ResObject resObject = ResObject.Allocate(objLoadInfo);
            ResInfo   resInfo   = ResManager.Instance.GetRes(objLoadInfo.mCRC);

            //之前就未加载
            if (resInfo == null)
            {
                ResLoadInfo resLoadInfo = ResLoadInfo.Allocate(objLoadInfo);
                resObject.mObj = LoadSync(resLoadInfo);
                resLoadInfo.Recycle2Cache();
            }
            //之前就加载完成
            else if (resInfo.State == ResState.Ready)
            {
                resInfo.Retain();
                resObject.mObj = resInfo.ResObject;
            }
            else
            {
                AFLogger.e("同步遇到异步正在或者等待加载的资源 : " + resInfo.ResPath + ",请检查调用代码!");
            }
            return(resObject);
        }
Ejemplo n.º 12
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);
        }
Ejemplo n.º 13
0
 public void CacheResObj(ResObject resObject)
 {
     mResouceObjDic.AddValue <int, ResObject>(resObject.mCloneObj.GetInstanceID(), resObject);
 }