Exemple #1
0
        private AbstractRes AddToLoad(ResName resName)
        {
            AbstractRes res = mResList.Find(r => r.Name.Equals(resName));

            if (res != null)
            {
                return(res);
            }

            res = ResMgr.Instance.GetRes(resName, true);

            //无论该资源是否加载完成,都需要添加对该资源依赖的引用
            ResName[] depends = res.GetDependencies();
            if (depends != null)
            {
                for (int i = 0; i < depends.Length; i++)
                {
                    AddToLoad(depends[i]);
                }
            }

            //add to list
            res.AddRef();
            mResList.Add(res);

            if (res.State != eResState.Ready)
            {
                mWaitLoadList.AddLast(res);
            }
            return(res);
        }
Exemple #2
0
        private void DoLoadAsync()
        {
            var curNode = mWaitLoadList.First;

            while (curNode != null)
            {
                var node = curNode;
                curNode = curNode.Next;

                AbstractRes res = node.Value;
                //ensure the dependecies are loaded beforehand
                if (res.IsDependencyLoadFinish())
                {
                    mWaitLoadList.Remove(node);

                    if (res.State != eResState.Ready)
                    {
                        res.RegisterListener(OnLoadAsyncFinish);
                        res.LoadAsync();
                    }
                    else
                    {
                        InvokeFinishCb(true, res);
                    }
                }

                //curNode已经被Remove了,说明已经执行过一次DoLoadAsync的递归调用,直接跳出
                if (curNode != null && !mWaitLoadList.Contains(curNode.Value))
                {
                    break;
                }
            }
        }
Exemple #3
0
        public static void Recycle(AbstractRes res)
        {
            switch (res.ResType)
            {
            case eResType.Assetbundle:
                SafeObjectPool <ABRes> .Instance.Recycle(res as ABRes);

                break;

            case eResType.Asset:
                SafeObjectPool <AssetRes> .Instance.Recycle(res as AssetRes);

                break;

            case eResType.Scene:
                SafeObjectPool <SceneRes> .Instance.Recycle(res as SceneRes);

                break;

            case eResType.Internal:
                SafeObjectPool <InternalRes> .Instance.Recycle(res as InternalRes);

                break;

            case eResType.SingleFile:
                SafeObjectPool <SingleFileRes> .Instance.Recycle(res as SingleFileRes);

                break;
            }
        }
Exemple #4
0
        /// <summary>
        /// Load resource synchronously
        /// </summary>
        /// <param name="name">res name with extension, e.g. "a.prefab"</param>
        /// <param name="abName">optional assetbundle name, in case of same naming.</param>
        public object LoadSync(string name, string abName = null)
        {
            AbstractRes res = AddToLoad(ResDataMgr.Instance.GetResName(name, abName));

            foreach (AbstractRes loadres in mWaitLoadList)
            {
                loadres.LoadSync();
            }
            mWaitLoadList.Clear();
            return(res.Asset);
        }
Exemple #5
0
        private void InvokeFinishCb(bool success, AbstractRes res)
        {
            List <UnityAction <bool, object> > callbacks;

            if (mFinishCbDict.TryGetValue(res, out callbacks))
            {
                foreach (UnityAction <bool, object> callback in callbacks)
                {
                    callback(success, res.Asset);
                }
                mFinishCbDict.Remove(res);
            }
        }
Exemple #6
0
 private void CleanResMap(Func <AbstractRes, bool> condition)
 {
     string[] keys = mResDict.Keys.ToArray();
     for (int i = 0; i < keys.Length; i++)
     {
         AbstractRes res = mResDict[keys[i]];
         if (condition(res))
         {
             if (res.ReleaseRes())
             {
                 mResDict.Remove(keys[i]);
                 ResFactory.Recycle(res);
             }
         }
     }
 }
Exemple #7
0
        public void Release(string name, string abName = null)
        {
            AbstractRes res = ResMgr.Instance.GetRes(ResDataMgr.Instance.GetResName(name, abName));

            if (res == null)
            {
                return;
            }

            mWaitLoadList.Remove(res);
            mFinishCbDict.Remove(res);

            if (mResList.Remove(res))
            {
                res.SubRef();
                ResMgr.Instance.SetDirty();
            }
        }
Exemple #8
0
        public static AbstractRes Create(ResName name)
        {
            AbstractRes res = null;

            switch (name.ResType)
            {
            case eResType.Assetbundle:
                res = SafeObjectPool <ABRes> .Instance.Allocate();

                break;

            case eResType.Asset:
                res = SafeObjectPool <AssetRes> .Instance.Allocate();

                break;

            case eResType.Scene:
                res = SafeObjectPool <SceneRes> .Instance.Allocate();

                break;

            case eResType.Internal:
                res = SafeObjectPool <InternalRes> .Instance.Allocate();

                break;

            case eResType.SingleFile:
                res = SafeObjectPool <SingleFileRes> .Instance.Allocate();

                break;
            }

            if (res == null)
            {
                throw new Exception(">>>[ResKit]: Create Res Error: " + name.FullName);
            }

            res.Init(name);
            return(res);
        }
Exemple #9
0
        /// <summary>
        /// Load resource asynchronously
        /// </summary>
        /// <param name="name">res name with extension, e.g. "a.prefab"</param>
        /// <param name="abName">optional assetbundle name, in case of same naming.</param>
        /// <param name="onFinish">on finish callback, with param: success boolean, and loaded object.</param>
        public void LoadAsync(string name, string abName = null, UnityAction <bool, object> onFinish = null)
        {
            AbstractRes res = AddToLoad(ResDataMgr.Instance.GetResName(name, abName));

            if (res.State == eResState.Ready)
            {
                if (onFinish != null)
                {
                    onFinish(true, res.Asset);
                }
            }
            else
            {
                if (onFinish != null)
                {
                    if (!mFinishCbDict.ContainsKey(res))
                    {
                        mFinishCbDict.Add(res, new List <UnityAction <bool, object> >());
                    }
                    mFinishCbDict[res].Add(onFinish);
                }
                DoLoadAsync();
            }
        }
Exemple #10
0
 private void OnLoadAsyncFinish(bool success, AbstractRes res)
 {
     InvokeFinishCb(success, res);
     res.RemoveListener(OnLoadAsyncFinish);
     DoLoadAsync();
 }