Unity GameFramework加载资源流程:
加载资源(LoadAsset)
检查资源(CheckAsset)
AssetInfo是资源信息,ResourceInfo是资源对应的AB包信息,在单机包初始化资源或热更包下载前检查资源时,会根据本地的version.dat或服务端的version.dat、Packed的list.dat、根据已下载资源的信息本地生成的list.dat,缓存AssetInfo、ResourceInfo信息,因此据此判断资源是否存在
开始加载资源(LoadAsset)
创建加载资源任务 → 遍历、加载依赖资源 → 检查依赖资源 → 创建依赖资源加载任务 ->遍历、加载依赖资源的依赖资源 → ...
以上过程递归,添加该资源及其所有依赖资源的加载任务到任务池,接下来在Update中执行加载任务
任务池Update
遍历执行中的任务(ProcessRunningTasks)
如果执行完成,则重置、释放任务Agent
遍历等待中的任务(ProcessWaitingTasks)
如果有等待的任务及空余任务代理,则分配任务代理
开始任务前,前置判断:
等待(HasToWait):资源正在加载、其依赖资源还未加载、其对应的ab包正在加载
取消当前任务代理,继续等待
完成(Done):资源池中已有该资源
移除当前任务
继续(CanResume):其对应的ab包已加载、开始加载任务
取消当前任务代理、移除当前任务、释放任务
判断为Done的情况:执行加载成功回调(OnAssetObjectReady,OnLoadAssetSuccess)
回调从LoadAsset开始传入,并传入加载任务中,最后执行回调(m_Task.OnLoadAssetSuccess)
加载资源任务完成,加载状态会被主动置为Done,相关任务及Agent在ProcessRunningTasks中被移除
加载依赖资源任务完成,会在ProcessWaitingTasks的agent.Start()判断为Done,移除相关任务及Agent
其对应的ab包已加载的情况:
加载资源(OnResourceObjectReady,m_Task.LoadMain,agent.Helper.LoadAsset)
从ab中异步加载资源(assetBundle.LoadAssetAsync)
加载成功、缓存资源(LoadResourceAgentHelperLoadComplete)
加载成功回调(OnAssetObjectReady)
转到判断为Done的情况
开始加载任务的情况:
读取文件加载对应的ab包(m_Helper.ReadFile)
异步加载ab包(AssetBundle.LoadFromFileAsync)
加载完成(LoadResourceAgentHelperReadFileComplete,OnResourceObjectReady)
转到ab包已加载的情况
读取二进制流加载ab包(m_Helper.ReadBytes)
异或解密,在打包时选择异或加密保存,读取时也必须异或解密才能正确读取(OnLoadResourceAgentHelperReadBytesComplete,m_DecryptResourceCallback)
二进制流转换为加载对象(AssetBundle.LoadFromMemoryAsync)
加载完成(OnLoadResourceAgentHelperParseBytesComplete,OnResourceObjectReady)
转到ab包已加载的情况