/// <summary> /// 在AssetBundle已加载的条件下加载资源 /// </summary> /// <param name="bundleName"></param> /// <param name="priority"></param> /// <param name="bundle"></param> public void DoEnqueuePending(string bundleName, LoadPriority priority, AssetBundle bundle = null) { BundleInfoResource BundleInfoResource = cache[bundleName]; BundleIndexItemInfo bundleInfo = ResourceMgr.Instance.GetBundleInfo(bundleName); if (BundleInfoResource != null && BundleInfoResource.AssetBundle) { AssetBundleAssetLoadingInfo info = new AssetBundleAssetLoadingInfo(bundleInfo); info.AssetBundle = BundleInfoResource.AssetBundle; info.IsAsync = true; info.Priority = priority; EnqueuePendingAssetBunlde(info); } else { if (bundle == null) { throw new NullReferenceException("Cannot find Bundle for " + bundleName); } AssetBundleAssetLoadingInfo info = new AssetBundleAssetLoadingInfo(bundleInfo); info.AssetBundle = bundle; info.IsAsync = true; info.Priority = priority; EnqueuePendingAssetBunlde(info); } }
public void EnqueuePendingAssetBunlde(AssetBundleAssetLoadingInfo info) { LinkedListNode <AssetBundleAssetLoadingInfo> cur = pendingBundle.First; LinkedListNode <AssetBundleAssetLoadingInfo> found = null; LoadPriority priority = info.Priority; while (cur != null) { if (cur.Value.BundleName == info.BundleName) { return; } if (found == null) { if (cur.Value.Priority < priority) { found = cur; } } cur = cur.Next; } if (cur != null) { pendingBundle.AddAfter(cur, info); } else { pendingBundle.AddLast(info); } }
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 StartLoadAssets(AssetBundleAssetLoadingInfo info) { try { BundleIndexItemInfo assetBundleInfo = info.BundleIndexInfo; var bundle = info.AssetBundle; if (!bundle) { DebugUtil.LogError(string.Format("AssetBundle {0} is null", info.BundleName)); return; } info.Requests = new List <AssetRequestInfo>(); bool shouldAsync = true; info.IsAsync = shouldAsync; BundleInfoResource cachedBundleInfo = cache[info.BundleName]; //是否全部加载 if (bundleLoadedCallbacks.ContainsKey(info.BundleName) || info.IsLoadAllAsset) { AssetRequestInfo bundleAllAssetsRequest = new AssetRequestInfo(info.BundleIndexInfo.BundleAssetsArray, info.AssetBundle); bundleAllAssetsRequest.RequestLoadAsset(info.IsAsync); info.Requests.Add(bundleAllAssetsRequest); } else { HashSet <string> pendingBundleAssets = null; if (this.m_pendingAssetIndexDict.TryGetValue(info.BundleName, out pendingBundleAssets)) { foreach (string pendingAsset in pendingBundleAssets) { AssetRequestInfo requestInfo = GetPendingAssetRequestInfo(pendingAsset, info.BundleName, info.AssetBundle); requestInfo.RequestLoadAsset(info.IsAsync); info.Requests.Add(requestInfo); } this.m_pendingAssetIndexDict[info.BundleName].Clear(); } } assetLoading.Add(info); } catch { DebugUtil.LogError("Cannot load assetbundle:" + info.BundleName); } }
void InvokeBundleLoaded(AssetBundleAssetLoadingInfo info) { Action <string, AssetBundle> cb = null; if (bundleLoadedCallbacks.TryGetValue(info.BundleName, out cb)) { try { cb(info.BundleName, info.AssetBundle); } catch (Exception ex) { Debug.LogError(ex.ToString()); } bundleLoadedCallbacks.Remove(info.BundleName); } }
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); } }
void StartLoadAssets(AssetBundleAssetLoadingInfo info) { try { GOEBundle gBundle = ResourceMgr.Instance().GetBundle(info.BundleName); var bundle = info.AssetBundle; if (!bundle) { Debug.LogError(string.Format("AssetBundle {0} is null", gBundle.mName)); return; } info.Requests = new List <AssetRequestInfo>(); bool shouldAsync = true; info.IsAsync = shouldAsync; #if DEBUG_BUNDLE_CACHE ResourceMgr.Instance().SampleLoadEvent(info.BundleName, 5); #endif foreach (string str in gBundle.Files) { AssetRequestInfo ar = new AssetRequestInfo(); ar.AssetName = str; if (shouldAsync) { ar.Request = bundle.LoadAssetAsync(str); } else { ar.Asset = bundle.LoadAsset(str); } info.Requests.Add(ar); } assetLoading.Add(info); } catch { Debug.LogError("Cannot load assetbundle:" + info.BundleName); } }
public void OnLoadAssetBundle(string name, AssetBundle bundle, bool dependencyResource, LoadPriority priority) { #if DEBUG_BUNDLE_CACHE ResourceMgr.Instance().SampleLoadEvent(name, 4); #endif RuntimeBundleInfo resourceBelongBundleInfo = ResourceMgr.Instance.GetBundleInfo(name); AssetBundleAssetLoadingInfo info = new AssetBundleAssetLoadingInfo(resourceBelongBundleInfo); info.AssetBundle = bundle; info.Priority = priority; if (!dependencyResource) { EnqueuePendingAssetBunlde(info); } else { BundleInfoResource res = new BundleInfoResource(resourceBelongBundleInfo); res.AssetBundle = info.AssetBundle; cache.CacheAssetBundle(res); InvokeBundleLoaded(info); MarkBundleDependency(res); } }
internal void Update() { #if DEBUG_BUNDLE_CACHE Profiler.BeginSample("GOEAssetBundleCacheManager.Update"); #endif while (assetLoading.Count < MaximalLoadingAssetBundles && pendingBundle.Count > 0) { var info = pendingBundle.First.Value; pendingBundle.RemoveFirst(); 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 BundleInfoResource res = cache[info.BundleName]; bool isNewBundle = false; if (res == null) { RuntimeBundleInfo resourceBelongBundleInfo = ResourceMgr.Instance.GetBundleInfo(info.BundleName); res = new BundleInfoResource(resourceBelongBundleInfo); res.AssetBundle = info.AssetBundle; cache.CacheAssetBundle(res); isNewBundle = true; } else { if (!res.AssetBundle) { res.AssetBundle = info.AssetBundle; } } bool isAsync = info.IsAsync; for (int j = 0; j < info.Requests.Count; j++) { AssetRequestInfo req = info.Requests[j]; for (int k = 0; k < req.Assets.Length; ++k) { UnityEngine.Object obj = req.Assets[k]; string assetName = req.RequestAssetsName[k]; if (!obj) { Debug.LogError($"can't load asset: {assetName}"); continue; } /*if (!assetName.StartsWithFast(obj.name)) * Debug.LogError($"get object not match objname:{obj.name},request name:{assetName}"); * else * {*/ AssetInfo asset = res[assetName]; if (asset == null) { asset = OnGotAsset(assetName, obj, info.BundleName); res.AddAsset(assetName, asset); } if (asset.AssetValid && obj != asset.Asset) { throw new Exception($"{assetName} not valid"); } if (obj) { asset.Asset = obj; } asset.Priority = info.Priority; if (obj) { if (asset.NeedInstance && asset.PoolCount == 0) { if (assetLoadedCallbacks.ContainsKey(assetName)) { EnqueueInstantiateAsset(asset); } } else { InvokeAssetLoaded(asset); } } /*}*/ } } if (isNewBundle) { InvokeBundleLoaded(info); MarkBundleDependency(res); } assetLoading.RemoveAt(i); #if DEBUG_BUNDLE_CACHE ResourceMgr.Instance().SampleLoadEvent(info.BundleName, 7); Profiler.EndSample(); #endif break;//一个Update只删除一个已完成Bundle } } if (instantiationQueue.Count > 0) { var asset = instantiationQueue.First.Value; if (!InvokeAssetLoaded(asset)) { instantiationQueue.RemoveFirst(); } } //不在加载资源时GC bool hasLoading = assetLoading.Count > 0 || pendingBundle.Count > 0 || instantiationQueue.Count > 0; if (!hasLoading) { cache.DoGC(); } #if DEBUG_BUNDLE_CACHE Profiler.EndSample(); #endif }
void StartLoadAssets(AssetBundleAssetLoadingInfo info) { try { var bundleName = info.BundleName; BundleInfo gBundle = ResourceMgr.Instance().GetBundle(bundleName); var bundle = info.AssetBundle; if (!bundle) { DebugUtil.LogError(string.Format("AssetBundle {0} is null", gBundle.mName)); return; } info.Requests = new List <AssetRequestInfo>(); bool shouldAsync = true; info.IsAsync = shouldAsync; bool isPreload = bundleLoadedCallbacks.ContainsKey(bundleName) || !ResourceModule.Instance.UseAssetBundleLoadFromFile; #if DEBUG_BUNDLE_CACHE ResourceMgr.Instance().SampleLoadEvent(bundleName, 5); #endif var cb = cache[bundleName]; foreach (string str in gBundle.Files) { AssetRequestInfo ar = null; bool isPending = assetLoadedCallbacks.ContainsKey(str); bool canContinue = true; if (cb != null) { var a = cb[str]; if (a != null && a.AssetValid) { if (isPending) { ar = new AssetRequestInfo(); ar.AssetName = str; ar.Asset = a.Asset; info.Requests.Add(ar); } continue; } else { canContinue = false; } } else { canContinue = false; } isPending = isPending || isPreload; if (!isPending && canContinue) { continue; } ar = new AssetRequestInfo(); ar.AssetName = str; //只加载请求中的资源 if (isPending) { bool isSprite = str.IndexOf('.') < 0; if (shouldAsync) { ar.Request = isSprite ? bundle.LoadAssetAsync <Sprite>(str) : bundle.LoadAssetAsync(str); } else { ar.Asset = isSprite ? bundle.LoadAsset <Sprite>(str) : bundle.LoadAsset(str); } } info.Requests.Add(ar); } assetLoading.Add(info); } catch { DebugUtil.LogError("Cannot load assetbundle:" + info.BundleName); } }
internal void Update() { #if DEBUG_BUNDLE_CACHE Profiler.BeginSample("GOEAssetBundleCacheManager.Update"); #endif while (assetLoading.Count < MaximalLoadingAssetBundles && pendingBundle.Count > 0) { var info = pendingBundle.First.Value; pendingBundle.RemoveFirst(); 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 BundleInfoResource res = cache[info.BundleName]; bool isNewBundle = false; if (res == null) { res = new BundleInfoResource(); res.AssetBundle = info.AssetBundle; res.BundleInfo = ResourceMgr.Instance().GetBundle(info.BundleName); cache.CacheAssetBundle(res); isNewBundle = true; } else { if (!res.AssetBundle) { res.AssetBundle = info.AssetBundle; } } bool isAsync = info.IsAsync; for (int j = 0; j < info.Requests.Count; j++) { AssetRequestInfo req = info.Requests[j]; UnityEngine.Object obj = isAsync && req.Request != null ? req.Request.asset : req.Asset; string assetName = req.AssetName; AssetInfo asset = null; if (isNewBundle) { asset = OnGotAsset(assetName, obj, info.BundleName); res.AddAsset(assetName, asset); } else { asset = res[assetName]; if (asset.AssetValid && obj != asset.Asset) { throw new NotSupportedException(); } if (obj) { asset.Asset = obj; } } asset.Priority = info.Priority; if (obj) { if (asset.NeedInstance && asset.PoolCount == 0) { if (assetLoadedCallbacks.ContainsKey(assetName)) { EnqueueInstantiateAsset(asset); } } else { InvokeAssetLoaded(asset); } } } if (isNewBundle) { InvokeBundleLoaded(info); MarkBundleDependency(res); } assetLoading.RemoveAt(i); #if DEBUG_BUNDLE_CACHE ResourceMgr.Instance().SampleLoadEvent(info.BundleName, 7); Profiler.EndSample(); #endif break;//一个Update只删除一个已完成Bundle } } if (instantiationQueue.Count > 0) { var asset = instantiationQueue.First.Value; if (!InvokeAssetLoaded(asset)) { instantiationQueue.RemoveFirst(); } } //不在加载资源时GC bool hasLoading = assetLoading.Count > 0 || pendingBundle.Count > 0 || instantiationQueue.Count > 0; if (!hasLoading) { cache.DoGC(); } #if DEBUG_BUNDLE_CACHE Profiler.EndSample(); #endif }