internal void Update() { #if DEBUG_BUNDLE_CACHE Profiler.BeginSample("GOEAssetBundleCacheManager.Update"); #endif while (assetLoading.Count < MaximalLoadingAssetBundles && pendingBundle.Count > 0) { var info = pendingBundle.Dequeue(); StartLoadAssets(info); } for (int i = 0; i < assetLoading.Count; i++) { AssetBundleAssetLoadingInfo info = assetLoading[i]; if (info.AllDone) { #if DEBUG_BUNDLE_CACHE ResourceMgr.Instance().SampleLoadEvent(info.BundleName, 6); #endif GOEBundleResource res = new GOEBundleResource(); res.AssetBundle = info.AssetBundle; res.BundleInfo = ResourceMgr.Instance().GetBundle(info.BundleName); cache.CacheAssetBundle(res); bool isAsync = info.IsAsync; for (int j = 0; j < info.Requests.Count; j++) { AssetRequestInfo req = info.Requests[j]; UnityEngine.Object obj = isAsync ? req.Request.asset : req.Asset; if (obj) { string assetName = req.AssetName; var asset = OnGotAsset(assetName, obj, info.BundleName); res.AddAsset(assetName, asset); InvokeAssetLoaded(asset); } } InvokeBundleLoaded(info); MarkBundleDependency(res); assetLoading.RemoveAt(i); #if DEBUG_BUNDLE_CACHE ResourceMgr.Instance().SampleLoadEvent(info.BundleName, 7); Profiler.EndSample(); #endif return;//一个Update只删除一个已完成Bundle } } //不在加载资源时GC bool hasLoading = assetLoading.Count > 0 || pendingBundle.Count > 0; if (!hasLoading) { cache.DoGC(); } #if DEBUG_BUNDLE_CACHE Profiler.EndSample(); #endif }
void MarkBundleDependency(GOEBundleResource res) { foreach (var i in res.BundleInfo.DependsOn) { var bundle = cache[i]; if (bundle != null) { res.AddDependency(bundle); } else { Debug.LogError(string.Format("Cannot find dependency bundle {0} for bundle {1}.", i, res.Name)); } } }
public void CacheSceneBundleDependency(GOEBundle bundle) { GOEBundleResource newRes = new GOEBundleResource(); newRes.BundleInfo = bundle; newRes.IsSceneBundle = true; foreach (var i in bundle.DependsOn) { GOEBundleResource res; if (cachedBundles.TryGetValue(i, out res)) { newRes.AddDependency(res); } } CacheAssetBundle(newRes); }
public bool CacheAssetBundle(GOEBundleResource bundle) { if (!cachedBundles.ContainsKey(bundle.Name)) { cachedBundles[bundle.Name] = bundle; cachedSize += bundle.Size; bundle.Touch(); /*#if DEBUG_BUNDLE_CACHE * Debug.Log(string.Format("{2:0.##}:Bundle {0} cached, new CacheSize={1:0.##}MB", bundle.Name, cachedSize / 1024f / 1024f, Time.realtimeSinceStartup)); #endif*/ needGC = true; return(true); } return(false); }
public void OnLoadAssetBundle(string name, AssetBundle bundle, bool dependencyResource) { #if DEBUG_BUNDLE_CACHE ResourceMgr.Instance().SampleLoadEvent(name, 4); #endif AssetBundleAssetLoadingInfo info = new AssetBundleAssetLoadingInfo(); info.AssetBundle = bundle; info.BundleName = name; if (!dependencyResource) { pendingBundle.Enqueue(info); } else { GOEBundleResource res = new GOEBundleResource(); res.AssetBundle = info.AssetBundle; res.BundleInfo = ResourceMgr.Instance().GetBundle(info.BundleName); cache.CacheAssetBundle(res); InvokeBundleLoaded(info); MarkBundleDependency(res); } }
public void AddDependency(GOEBundleResource bundle) { dependsOn.Add(bundle); bundle.referencedBy.Add(this); bundle.BundleInfo.IsDependency = true;//被依赖的包永不能卸载AssetBundle }