Esempio n. 1
0
        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
        }
Esempio n. 2
0
 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));
         }
     }
 }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
            }
        }
Esempio n. 6
0
 public void AddDependency(GOEBundleResource bundle)
 {
     dependsOn.Add(bundle);
     bundle.referencedBy.Add(this);
     bundle.BundleInfo.IsDependency = true;//被依赖的包永不能卸载AssetBundle
 }