コード例 #1
0
        /// <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);
            }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
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
        }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
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);
            }
        }
コード例 #7
0
        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);
            }
        }
コード例 #8
0
        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);
            }
        }
コード例 #9
0
        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
        }
コード例 #10
0
        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);
            }
        }
コード例 #11
0
        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
        }