Beispiel #1
0
        /// <summary>
        /// 停止加载
        /// </summary>
        /// <param name="item"></param>
        public void StopLoad(LoadItem item)
        {
            // 移除加载字典
            if (_loadDict.ContainsKey(item.url))
            {
                _loadDict.Remove(item.url);
            }

            // 移除加载优先级字典
            _loadListDict[(int)item.priority].Remove(item);

            // 移除当前加载器字典
            ILoader loader;

            if (_currentLoaders.TryGetValue(item.url, out loader))
            {
                _currentLoaders.Remove(item.url);
                loader.Dispose();
            }
        }
Beispiel #2
0
        private void LoadNext()
        {
            // 判断是否已达到最大加载限制
            if (_currentLoaders.Count >= _maxLoaders)
            {
                return;
            }

            // 遍历加载列表
            for (int i = (int)LoadPriority.LV_FIRST; i <= (int)LoadPriority.LV_4; i++)
            {
                List <LoadItem> items = _loadListDict[i];
                while (items.Count > 0)
                {
                    // 取出加载队列中最早的加载项,执行加载
                    LoadItem item = items[0];
                    items.RemoveAt(0);

                    // 判断内存中是否已存在资源
                    IAsset asset = App.assetManager.GetAsset(item.id);

                    // 已存在资源则结束加载
                    if (asset != null)
                    {
                        EndLoad(item, asset);
                    }
                    else
                    {
                        // 开始加载
                        StartLoad(item);

                        // 判断是否已达到最大加载限制
                        if (_currentLoaders.Count >= _maxLoaders)
                        {
                            return;
                        }
                    }
                }
            }
        }
Beispiel #3
0
        private void OnItemProgress(LoadItem item)
        {
            _currentItem = item;

            SetLoadItemProgress(item);

            float totalProgress = 0f;

            foreach (LoadItem loadItem in _items)
            {
                totalProgress += loadItem.progress;
            }
            _progress = totalProgress / _items.Count;

            if (_progressCallback != null)
            {
                _progressCallback.Invoke(this);
            }

            if (_dispatchEvent)
            {
                DispatchEvent(ResourceManagerEventArgs.QUEUE_PROGRESS, this);
            }
        }
Beispiel #4
0
        /// <summary>
        /// 加载资源
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public LoadItem Load(LoadItem item)
        {
            if (item == null)
            {
                return(null);
            }

            // 判断内存中是否存在该资源
            IAsset asset = App.assetManager.GetAsset(item.id);

            if (asset != null)
            {
                item.asset = asset;
                if (item.completeCallback != null)
                {
                    item.completeCallback.Invoke(item);
                }
                return(item);
            }

            // 判断是否为ab包
            if (item.loadImmediately && item.isAssetBundle && item.type != LoadType.AUDIO_ASSET_BUNDLE)
            {
                asset = LoadAssetFromAssetBundle(item.url, item.id, item.type, item.cache);
                if (asset != null)
                {
                    item.asset = asset;
                    // 执行加载完成回调
                    if (item.completeCallback != null)
                    {
                        item.completeCallback.Invoke(item);
                    }
                    return(item);
                }
            }

            // 判断内存中是否存在
            if (App.fileManager.FileExistsPersistent(item.url))
            {
                item.priority = LoadPriority.LV_FIRST;
            }

            // 内存中不存在则开始加载资源
            LoadItem loadItem;

            if (_loadDict.TryGetValue(item.url, out loadItem) == false)
            {
                // 加载队列中未存在该加载项
                _loadDict[item.url] = item;
                _loadListDict[(int)item.priority].Add(item);
            }
            else
            {
                // 加载队列中已存在该加载项
                if (item.priority != loadItem.priority)
                {
                    // 重新设置加载优先级
                    _loadListDict[(int)loadItem.priority].Remove(loadItem);
                    _loadListDict[(int)item.priority].Add(loadItem);
                    loadItem.priority = item.priority;
                }
                // 添加加载回调
                loadItem.completeCallback += item.completeCallback;
                loadItem.errorCallback    += item.errorCallback;
                loadItem.progressCallback += item.progressCallback;
            }

            // 继续执行加载
            LoadNext();
            return(loadItem);
        }
Beispiel #5
0
 /// <summary>
 /// 是否正在加载
 /// </summary>
 /// <param name="item"></param>
 /// <returns></returns>
 public bool IsLoading(LoadItem item)
 {
     return(_loadDict.ContainsKey(item.url));
 }
Beispiel #6
0
 /// <summary>
 /// 移除加载回调
 /// </summary>
 /// <param name="item"></param>
 public void RemoveLoadCallbackImmediately(LoadItem item)
 {
     RemoveLoadCallbackImmediately(item.url, item.completeCallback, item.progressCallback, item.errorCallback);
 }
Beispiel #7
0
        /// <summary>
        /// 立即加载资源
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public LoadItem LoadImmediately(LoadItem item)
        {
            if (item == null)
            {
                return(null);
            }

            // 判断内存中是否存在该资源
            IAsset asset = App.assetManager.GetAsset(item.id);

            if (asset != null)
            {
                item.asset = asset;
                if (item.completeCallback != null)
                {
                    item.completeCallback.Invoke(item);
                }
                return(item);
            }

            // 判断是否为ab包
            if (item.loadImmediately && item.isAssetBundle && item.type != LoadType.AUDIO_ASSET_BUNDLE)
            {
                asset = LoadAssetFromAssetBundle(item.url, item.id, item.type, item.cache);
                if (asset != null)
                {
                    item.asset = asset;
                    // 执行加载完成回调
                    if (item.completeCallback != null)
                    {
                        item.completeCallback.Invoke(item);
                    }
                    return(item);
                }
            }

            // 内存中不存在则开始加载资源
            LoadItem loadItem;

            if (_immediateDict.TryGetValue(item.url, out loadItem) == false)
            {
                // 加载队列中未存在该加载项
                _immediateDict[item.url] = item;
                // 设置加载项开始加载
                item.isLoading = true;
                // 创建加载器
                //string urlAbsolute;
                //// 判断是否从Persistent目录加载
                //if (App.fileManager.FileExistsPersistent(item.url))
                //    urlAbsolute = new StringBuilder(App.pathManager.persistentDataPathWWW).Append(item.url).ToString();
                //else
                //    urlAbsolute = new StringBuilder(App.pathManager.externalPath).Append(item.url).ToString();

                ILoader loader = LoaderFactory.CreateLoader(item.url, null, item.type);
                item.loader = loader;

                // 设置加载回调
                loader.completeCallback = LoadCompleteImmediately;
                loader.progressCallback = LoadProgressImmediately;
                loader.errorCallback    = LoadErrorImmediately;

                // 开始加载
                loader.Start();
            }
            else
            {
                // 加载队列中已存在该加载项
                loadItem.completeCallback += item.completeCallback;
                loadItem.errorCallback    += item.errorCallback;
                loadItem.progressCallback += item.progressCallback;
            }

            return(loadItem);
        }
Beispiel #8
0
 public ResourceManagerEventArgs(string type, LoadItem loadItem)
 {
     _type     = type;
     _loadItem = loadItem;
 }
Beispiel #9
0
 private void LoadErrorCallback(LoadItem item)
 {
     _state = AudioState.UNLOAD;
 }