加了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的使用