コード例 #1
0
        private const int MaxTryNum     = 3;  // 最多重试次数

        private void Update( )
        {
            // 下载量充足,增加新的下载
            if (_loadingQueue.Count < MaxWorkingCnt)
            {
                int cnt = MaxWorkingCnt - _waitingQueue.Count;

                for (int i = 0; i < cnt; i++)
                {
                    if (_waitingQueue.Count <= 0)
                    {
                        break;
                    }

                    string url = _waitingQueue.Dequeue( );
                    _loadingQueue.Add(new LoadingAbInfo(url));
                }
            }

            // 检查下载状态
            for (var index = _loadingQueue.Count - 1; index >= 0; index--)
            {
                LoadingAbInfo info = _loadingQueue[index];
                if (info.State == LoadStateType.Loding)
                {
                    continue;
                }

                // 三次都没有下载下来
                if (info.ErrorCount >= MaxTryNum)
                {
                    GameLogger.GetInstance( )
                    .Output(string.Format("!!!!! AssetBundle CreateFromWWW failed: {0}\n\t ErrorCount >= {1}",
                                          info.Url, MaxTryNum));
                    _loadingQueue.RemoveAt(index);
                    continue;
                }

                StartCoroutine(OnAssetLoadStart(info));
            }

            // 检查request的完成情况
            List <string> tmpKeys = new List <string>(_requests.Keys);

            foreach (var one in tmpKeys)
            {
                AsyncLoadRequest request = _requests[one];
                if (request.CompletedCallback( ))
                {
                    _requests.Remove(one);
                }
            }
        }
コード例 #2
0
        public void CreateDependsReques(string url, string mainUrl)
        {
            // 注册一个回调
            AsyncLoadRequest request = _requests[mainUrl];

            if (request == null)
            {
                throw new Exception("CreateDependsReques AsyncLoadRequest == null");
            }

            RegisterLoadedCallBack(url, request.UrlLoadedCallBack);

            // 没有正在下载的相同url,排个队
            if (!IsLoading(url))
            {
                _waitingQueue.Enqueue(url);
            }
        }
コード例 #3
0
        private void CreateRequest(string url, AsyncLoadCallBack.CallBack onAsyncRequestCallBack, object context)
        {
            // ①:先创建一个回调
            AsyncLoadCallBack callbackFun = new AsyncLoadCallBack(onAsyncRequestCallBack, context);

            // ③是否已有加载数据,已有,注册一个回调函数,等待返回
            if (_requests.ContainsKey(url))
            {
                _requests[url].Callbacks.Add(callbackFun);
                return;
            }

            // ②:没有加载相关数据,新建一个异步请求,注册一个回调函数
            // url可能已存在于缓存,需要请求的是依赖项
            AsyncLoadRequest request =
                new AsyncLoadRequest(url, AssetBundleMgr.GetInstance( ).GetAbDependencies(url));

            request.Callbacks.Add(callbackFun);
            _requests.Add(url, request);

            AssetBundle ab = GetAb(url);

            if (ab == null)
            {
                RegisterLoadedCallBack(url, request.UrlLoadedCallBack);
            }
            else
            {
                // 主ab包已经加载了,需要加载的是依赖包
                string depsUrl = request.GetUnLoadUrl( );
                RegisterLoadedCallBack(depsUrl, request.UrlLoadedCallBack);
                url = depsUrl;
            }

            // ④:没有正在下载的相同url,排个队
            if (!IsLoading(url))
            {
                _waitingQueue.Enqueue(url);
            }
        }