protected override void StartOneLoadAsync(IBundleLoadTask task) { string path = null; path = BundlePathInfoHelepr.GetBundlePath(task.QueryId); if (!File.Exists(path)) { #if UNITY_EDITOR Debug.LogError($"目标bundle路径{path}不存在!"); #endif } var request = AssetBundle.LoadFromFileAsync(path); #if UNITY_EDITOR ////AnalyzeProfiler.SaveStartLoad(task.TargetBundleId); #endif LoadingIds.Add(task.TargetBundleId); request.completed += op => { IBundleRef bundleRef = null; try { LoadingIds.Remove(task.TargetBundleId); if (request.assetBundle == null) { bundleRef = null; if (Buffer.HasValue(task.TargetBundleId)) { bundleRef = Buffer.GetValue(task.TargetBundleId); } if (bundleRef == null) { throw new Exception($"Bundle__{task.TargetBundleId}加载失败!"); } } else { bundleRef = new BundleRef(); bundleRef.Update(request.assetBundle, OnBundleRelease); SetLoadState(task.TargetBundleId, LoadState.Loaded); Buffer.TryCache(task.TargetBundleId, bundleRef); TryIncreaseBundleRef(bundleRef); } #if UNITY_EDITOR ////AnalyzeProfiler.SaveEndLoad(task.TargetBundleId); #endif } catch (Exception e) { #if DEBUG Debug.LogError(e.Message + e.StackTrace); #endif } finally { string targetBundleId = task.TargetBundleId; RestoreTask(task); Callbcker.Callback(targetBundleId, bundleRef); } }; void TryIncreaseBundleRef(IBundleRef bundleRef) { if (task.InitiatedAssetId == null) { bundleRef.Use(); } } }
public IBundleRef Load(string assetId) { var assetLowerId = assetId.ToLower(); var bundleId = BundlePathInfoHelepr.GetBundleId(assetLowerId); var loadState = GetLoadState(bundleId); switch (loadState) { case LoadState.NotLoad: return(OnNotLoad()); case LoadState.Loaded: return(OnLoaded()); case LoadState.Loading: //Todo 待完成 //Debug.LogError("错误,在异步加载中,调用了词资源的同步加载"); return(OnNotLoad()); default: throw new ArgumentOutOfRangeException(); } IBundleRef OnNotLoad() { var dependInfo = DependInfoHelper.GetDependInfo(bundleId); if (dependInfo == null) { dependInfo = new BundleDependInfo(bundleId, new string[0]); } #if DEBUG m_countChian = 0; #endif return(LoadBundleChian(bundleId, dependInfo)); } IBundleRef OnLoaded() { var bundleRef = Buffer.GetValue(bundleId); return(bundleRef); } IBundleRef LoadBundleChian(string initiatedBundleId, BundleDependInfo dependInfo) { #if DEBUG m_countChian++; if (m_countChian > 100) { Debug.LogError("严重错误:同步加载堆栈超过100,请检查加载逻辑或资源依赖关系:" + initiatedBundleId); return(null); } #endif var dependIds = dependInfo.DirectDepends; var dependCount = dependIds.Count; var loadState2 = GetLoadState(dependInfo.BundleId); IBundleRef bundleRef2; if (loadState2 == LoadState.Loaded) { bundleRef2 = Buffer.GetValue(dependInfo.BundleId); bundleRef2.Use(); return(bundleRef2); } else if (loadState2 == LoadState.AddTask) { return(null); } SetLoadState(dependInfo.BundleId, LoadState.AddTask); for (int index = 0; index < dependCount; index++) { var sonId = dependIds[index]; var sonDepndInfo = DependInfoHelper.GetDependInfo(sonId); if (sonDepndInfo.DirectDepends.Count > 0) { LoadBundleChian(initiatedBundleId, sonDepndInfo); } else { loadState2 = GetLoadState(sonId); IBundleRef bundleRef; if (loadState2 != LoadState.NotLoad) { if (loadState2 == LoadState.Loaded) { bundleRef = Buffer.GetValue(sonId); bundleRef.Use(); continue; } else if (loadState2 == LoadState.AddTask) { continue; } } var bundlePath = BundlePathInfoHelepr.GetBundlePath(sonId); #if UNITY_EDITOR ////AnalyzeProfiler.SaveStartLoad(sonId); #endif var assetBundle = AssetBundle.LoadFromFile(bundlePath); bundleRef = new BundleRef(); if (assetBundle != null) { bundleRef.Update(assetBundle, OnBundleRelease); bundleRef.Use(); Buffer.TryCache(sonId, bundleRef); SetLoadState(sonId, LoadState.Loaded); } else { SetLoadState(sonId, LoadState.NotLoad); } #if UNITY_EDITOR ////AnalyzeProfiler.AddBundleToBundleRef(sonId, dependInfo.BundleId); #endif } } loadState2 = GetLoadState(dependInfo.BundleId); if (loadState2 == LoadState.Loaded) //Todo 如果在异步加载中应该怎么设计? { bundleRef2 = Buffer.GetValue(dependInfo.BundleId); bundleRef2.Use(); return(bundleRef2); } var bundlePath2 = BundlePathInfoHelepr.GetBundlePath(dependInfo.BundleId); #if UNITY_EDITOR ////AnalyzeProfiler.SaveStartLoad(dependInfo.BundleId); #endif var assetBundle2 = AssetBundle.LoadFromFile(bundlePath2); bundleRef2 = new BundleRef(); if (assetBundle2 != null) { bundleRef2.Update(assetBundle2, OnBundleRelease); bundleRef2.Use(); Buffer.TryCache(dependInfo.BundleId, bundleRef2); SetLoadState(dependInfo.BundleId, LoadState.Loaded); } else { SetLoadState(dependInfo.BundleId, LoadState.NotLoad); return(null); } #if UNITY_EDITOR ////AnalyzeProfiler.AddBundleToBundleRef(initiatedBundleId, dependInfo.BundleId); #endif return(bundleRef2); } }