コード例 #1
0
    void Update()
    {
        if (!ConfigLoaded)
        {
            return;
        }

        _finishList.Clear();
        _failedsList.Clear();

        //处理正在处理的request,如果已经OK,则切换到newFinish队列
        //如果失败,再切换到newFail中
        foreach (BundleRequest request in _processingRequest.Values)
        {
            if (!request.IsDone)
            {
                continue;
            }

            if (request.CreateRequest == null)
            {
                if (request.triedTimes - 1 < BmConfiger.DownloadRetryTime)
                {
                    //use asset bundle
                    request.CreateAssetBundle();
                }
                else
                {
                    _failedsList.Add(request.Url);
                    Debug.LogError("Download " + request.Url + " failed for " + request.triedTimes + " times.");
                }
            }
            else if (request.CreateRequest.isDone)
            {
                _finishList.Add(request.Url);
            }
        }

        //将newFinish中的移动到successd队列之中
        foreach (string finishedUrl in _finishList)
        {
            BundleRequest finishRequest = _processingRequest[finishedUrl];

            _succeedRequest.Add(finishedUrl, finishRequest);

            _processingRequest.Remove(finishedUrl);

            finishRequest.LoadComplete();
        }

        // 将失败的request加入到失败队列中
        foreach (string finishedUrl in _failedsList)
        {
            if (!_failedRequest.ContainsKey(finishedUrl))
            {
                _failedRequest.Add(finishedUrl, _processingRequest[finishedUrl]);
            }
            _processingRequest.Remove(finishedUrl);
        }

        // Start download new bundles
        int waitingIndex = 0;

        //处理等待队列,等待队列之中,有dependRequest,也有真正需要使用的depend
        while (_processingRequest.Count < BmConfiger.DownloadThreadsCount &&
               waitingIndex < _waitingRequests.Count)
        {
            BundleRequest curRequest = _waitingRequests[waitingIndex++];

            bool canStartDownload = curRequest.bundleData == null || isBundleDependenciesReady(curRequest.bundleData.name);

            if (canStartDownload)
            {
                _waitingRequests.Remove(curRequest);

                curRequest.CreateAssetBundle();

                _processingRequest.Add(curRequest.Url, curRequest);
            }
        }
    }