IEnumerator CoLoadBundleAsync <T>(string assetName, string bundleName, E_LoadAsset eloadAsset, System.Action <T> callback) where T : IAssetGetter, new() { AssetBundle bundle = null; BundleHolder bundleHolder = null; AssetBundleCreateRequest bundleRequest; // 没有加载过bundle string bundlePath; if (!bundleHolders.TryGetValue(bundleName, out bundleHolder)) { bundlePath = GetBundlePath(bundleName); //bundleRequest = AssetBundle.LoadFromFileAsync(Path.Combine(bundleRootPath, bundleName)); bundleRequest = AssetBundle.LoadFromFileAsync(bundlePath); while (!bundleRequest.isDone) { yield return(bundleRequest); } //存bundleHolder bundle = bundleRequest.assetBundle; bundleHolder = new BundleHolder(bundle); bundleHolder.AddRefence(assetName); //Debug.LogError(Time.realtimeSinceStartup + " " + bundleName + " " + assetName); bundleHolders.Add(bundleName, bundleHolder); } else { bundleHolder.AddRefence(assetName); bundle = bundleHolder.Get(); } // 加载依赖的bundle string[] dependencies = manifest.GetAllDependencies(bundleName); for (int i = 0, iMax = dependencies.Length; i < iMax; ++i) { BundleHolder dependBundleHolder = null; if (bundleHolders.TryGetValue(dependencies[i], out dependBundleHolder)) { //已经存在的bundle只增加引用 dependBundleHolder.AddRefence(assetName); continue; } //没加载过的 AssetBundle dependBundle = null; bundlePath = GetBundlePath(dependencies[i]); bundleRequest = AssetBundle.LoadFromFileAsync(bundlePath); while (!bundleRequest.isDone) { yield return(bundleRequest); } dependBundle = bundleRequest.assetBundle; dependBundleHolder = new BundleHolder(dependBundle); dependBundleHolder.AddRefence(assetName); //存bundleHolder bundleHolders.Add(dependencies[i], dependBundleHolder); } yield return(CoLoadAssetAsync <T>(bundle, assetName, eloadAsset, callback)); }
AssetBundle LoadBundle(string assetName, string bundleName) { AssetBundle bundle = null; BundleHolder bundleHolder = null; // 没有加载过bundle string bundlePath = GetBundlePath(bundleName); if (!bundleHolders.TryGetValue(bundleName, out bundleHolder)) { //Debug.LogError("LoadFromFile [" + bundlePath + "]"); bundle = AssetBundle.LoadFromFile(bundlePath); //存bundleHolder bundleHolder = new BundleHolder(bundle); bundleHolder.AddRefence(assetName); bundleHolders.Add(bundleName, bundleHolder); } else { bundleHolder.AddRefence(assetName); bundle = bundleHolder.Get(); } // 加载依赖的bundle string [] dependencies = manifest.GetAllDependencies(bundleName); for (int i = 0, iMax = dependencies.Length; i < iMax; ++i) { BundleHolder dependBundleHolder = null; if (bundleHolders.TryGetValue(dependencies[i], out dependBundleHolder)) { //已经存在的bundle只增加引用 dependBundleHolder.AddRefence(assetName); continue; } //没加载过的 bundlePath = GetBundlePath(dependencies[i]); //AssetBundle dependBundle = AssetBundle.LoadFromFile(Path.Combine(bundleRootPath, dependencies[i])); AssetBundle dependBundle = AssetBundle.LoadFromFile(bundlePath); dependBundleHolder = new BundleHolder(dependBundle); dependBundleHolder.AddRefence(assetName); //存bundleHolder bundleHolders.Add(dependencies[i], dependBundleHolder); } return(bundle); }
/// <summary> /// 释放接口,释放所有未被引用的资源。 /// 1.把go中,所有资源Holder可以释放的情况下,移除go(销毁go时会释放,但是释放资源时不会,所以这里要统一处理) /// 2.把引用计数为0的资源引用取出。本类的DestroyXX减少资源引用计数。 /// 3.然后看看是否能把对应的bundle能释放 /// </summary> public void RealseAllUnUse() { unUseGameObject.Clear(); bool could = true; foreach (var kv in goAssetHolders) { could = true; HashSet <AssetHolder> assetholders = kv.Value; foreach (var item in assetholders) { if (!item.CouldRealse()) { could = false; break; } } if (could) { unUseGameObject.Add(kv.Key); } } for (int i = 0, iMax = unUseGameObject.Count; i < iMax; ++i) { goAssetHolders[unUseGameObject[i]].Clear(); Debug.LogError("remove" + unUseGameObject[i].name); goAssetHolders.Remove(unUseGameObject[i]); } unUseAssets.Clear(); foreach (var kv in nameAssetHolders) { if (kv.Value.CouldRealse()) { unUseAssets.Add(kv.Key); } } for (int i = 0, iMax = unUseAssets.Count; i < iMax; ++i) { string bundleName = GetBundleName(unUseAssets[i]); BundleHolder bundleHolder = null; if (bundleHolders.TryGetValue(bundleName, out bundleHolder)) { bundleHolder.RemoveRefence(unUseAssets[i]); if (bundleHolder.CouldRealse()) { bundleHolder.Release(); bundleHolders.Remove(bundleName); } } string[] dependencies = this.manifest.GetAllDependencies(bundleName); for (int k = 0, kMax = dependencies.Length; k < kMax; ++k) { BundleHolder dependBundleHolder = null; if (bundleHolders.TryGetValue(dependencies[k], out dependBundleHolder)) { dependBundleHolder.RemoveRefence(unUseAssets[i]); if (dependBundleHolder.CouldRealse()) { dependBundleHolder.Release(); bundleHolders.Remove(dependencies[k]); } } } nameAssetHolders[unUseAssets[i]].Release(); nameAssetHolders.Remove(unUseAssets[i]); } }