资源管理(20)编写和使用分类资源池(AssetPool)缓存资源

加了AssetPool

先从AssetPool中去取,没取到从AssetbundlePool中取AssetBundle然后加载,还没取到就去加载AssetBundle

 

 

 

分类面板显示代码,设置属性

 

加载任何一个资源, 最后都会走到

 

第一步是从池中去取,先从AssetPool取,如果没有再去走资源包,走资源包加载出资源之后把资源加到AssetPool池里面,

加载资源包和加载资源都面临,好几个地方去加载的问题,从资源包中加载资源虽然不会报错出现bug,但还是会影响性能,

 /// <summary>
        /// 真正的加载主资源
        /// </summary>
        private void LoadMainAsset()
        {
            //1.从分类资源池(AssetPool)中查找
            m_CurrResourceEntity = GameEntry.Pool.PoolManager.AssetPool[m_CurrAssetEnity.Category].Spawn(m_CurrAssetEnity.AssetFullName);
            if (m_CurrResourceEntity != null)
            {
                //GameEntry.Log(LogCategory.Resource, "从分类资源池中加载{0}", m_CurrResourceEntity.ResourceName);
                if (m_OnComplete != null) m_OnComplete(m_CurrResourceEntity);
                return;
            }

            //2.找资源包,找Assetbundle
            GameEntry.Resource.ResourceLoaderManager.LoadAssetBundle(m_CurrAssetEnity.AssetBundleName, onComplete: (AssetBundle bundle) =>
            {
                //3.加载资源
                GameEntry.Resource.ResourceLoaderManager.LoadAsset(m_CurrAssetEnity.AssetFullName, bundle, onComplete: (UnityEngine.Object obj) =>
                  {
                      //4.再次检查 很重要 不检查引用计数会出错
                      m_CurrResourceEntity = GameEntry.Pool.PoolManager.AssetPool[m_CurrAssetEnity.Category].Spawn(m_CurrAssetEnity.AssetFullName);
                      if (m_CurrResourceEntity != null)
                      {
                          if (m_OnComplete != null) m_OnComplete(m_CurrResourceEntity);
                          return;
                      }

                      //资源池注册资源
                      m_CurrResourceEntity = GameEntry.Pool.DequeueClassObject<ResourceEntity>();
                      m_CurrResourceEntity.Category = m_CurrAssetEnity.Category;
                      m_CurrResourceEntity.IsAssetBundle = false;
                      m_CurrResourceEntity.ResourceName = m_CurrAssetEnity.AssetFullName;
                      m_CurrResourceEntity.Target = obj;
                      GameEntry.Pool.PoolManager.AssetPool[m_CurrAssetEnity.Category].Register(m_CurrResourceEntity);

                      //加入到这个资源的依赖资源链表里
                      var currDependsResource = m_DependResourceList.First;
                      while (currDependsResource != null)
                      {
                          var next = currDependsResource.Next;
                          m_DependResourceList.Remove(currDependsResource);
                          m_CurrResourceEntity.DependsResourceList.AddLast(currDependsResource);
                          currDependsResource = next;
                      }

                      //当前主资源加载器 加载完毕(类递归)
                      if (m_OnComplete != null) m_OnComplete(m_CurrResourceEntity);

                      //资源加载完毕之后重置,重置的时候把当前对象回池
                      Reset();
                  });
            });
        }

从资源包中加载资源,如果资源在加载中,把加载中的委托放入资源链表中,如果没在家中中,把加载完成的委托放入链表中,然后再把文件名作为键加入到字典里,加载完毕后,循环委托链表执行加载完成后的方法,然后清空链表,把加载到的对象,放入池中,从加载中的字典把文件移除,表示资源已经不在加载中了。

 

现在去加载UI

 

        /// <summary>
        /// 打开UI窗口
        /// </summary>
        /// <param name="uiFormId">窗口Id</param>
        internal void OpenUIForm(int uiFormId, object userData, BaseAction<UIFormBase> onOpen)
        {
            //不能重复打开同一个UI窗口
            if (IsExists(uiFormId)) return;

            //1,读表
            Sys_UIFormEntity entity = GameEntry.DataTable.DataTableManager.Sys_UIFormDBModel.GetDic(uiFormId);
            if (entity == null)
            {
                List<Sys_UIFormEntity> lst = GameEntry.DataTable.DataTableManager.Sys_UIFormDBModel.GetList();
                Debug.LogError(uiFormId + "对应的UI窗口不存在");
                for (int i = 0; i < lst.Count; i++)
                {
                    Debug.LogError(lst[i].AssetPath_Chinese + "==" + lst[i].Id);
                }
                return;
            }

            UIFormBase formBase = GameEntry.UI.Dequeue(uiFormId);
            if (formBase == null)
            {
                //TODO:异步加载UI需要时间 此处需要处理过滤加载中的UI

                string assetPath = string.Empty;
                switch (GameEntry.Localization.CurrLanguage)
                {
                    case YouYouLanguage.Chinese:
                        assetPath = entity.AssetPath_Chinese;
                        break;
                    case YouYouLanguage.English:
                        assetPath = entity.AssetPath_English;
                        break;
                }

                //加载UI资源并克隆
                LoadUIAsset(assetPath, (GameObject uiObj) =>
                {
                    uiObj.SetParent(GameEntry.UI.GetUIGroup(entity.UIGroupId).Group);

                    formBase = uiObj.GetComponent<UIFormBase>();
                    formBase.Init(uiFormId, entity.UIGroupId, entity.DisableUILayer == 1, entity.IsLock == 1, userData);
                    m_OpenUIFormList.AddLast(formBase);

                    if (onOpen != null) onOpen(formBase);
                });
            }
            else
            {
                formBase.gameObject.SetActive(true);
                formBase.Open(userData);
                m_OpenUIFormList.AddLast(formBase);

                if (onOpen != null) onOpen(formBase);
            }
        }

 

        /// <summary>
        /// 加载UI资源并克隆
        /// </summary>
        /// <param name="assetPath"></param>
        /// <param name="onComplete"></param>
        private void LoadUIAsset(string assetPath, BaseAction<GameObject> onComplete)
        {
            //加载主资源
            GameEntry.Resource.ResourceLoaderManager.LoadMainAsset(AssetCategory.UIPrefab, string.Format("UI/UIPrefab/{0}.prefab", assetPath), (ResourceEntity resourcesEntity) =>
            {
                GameObject uiObj = Object.Instantiate((Object)resourcesEntity.Target) as GameObject;
                //把克隆出来的资源 加入实体资源池
                GameEntry.Pool.RegisterInstanceResource(uiObj.GetInstanceID(), resourcesEntity);

                if (onComplete != null) onComplete(uiObj);
            });
        }

启动了加载器,加载器加载资源的时候会先取分类资源池中加载,只要分类资源池存在就不需要走AssetBundle,只有当分类资源池中也释放掉,才走Assetbundle。减少对bundle的使用

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值