private IDataSource <object> SubmitPrefetchRequest(
            IProducer <object> producerSequence,
            ImageRequest imageRequest,
            RequestLevel lowestPermittedRequestLevelOnSubmit,
            object callerContext,
            int priority)
        {
            IRequestListener requestListener = GetRequestListenerForRequest(imageRequest);

            try
            {
                RequestLevel lowestPermittedRequestLevel = RequestLevel.GetMax(
                    imageRequest.LowestPermittedRequestLevel,
                    lowestPermittedRequestLevelOnSubmit);

                SettableProducerContext settableProducerContext = new SettableProducerContext(
                    imageRequest,
                    GenerateUniqueFutureId(),
                    requestListener,
                    callerContext,
                    lowestPermittedRequestLevel.Value,
                    /* isPrefetch */ true,
                    /* isIntermediateResultExpected */ false,
                    priority);

                return(ProducerToDataSourceAdapter <object> .Create(
                           producerSequence,
                           settableProducerContext,
                           requestListener));
            }
            catch (Exception exception)
            {
                return(DataSources.ImmediateFailedDataSource <object>(exception));
            }
        }
        private IDataSource <CloseableReference <T> > SubmitFetchRequest <T>(
            IProducer <CloseableReference <T> > producerSequence,
            ImageRequest imageRequest,
            RequestLevel lowestPermittedRequestLevelOnSubmit,
            object callerContext)
        {
            IRequestListener requestListener = GetRequestListenerForRequest(imageRequest);

            try
            {
                RequestLevel lowestPermittedRequestLevel = RequestLevel.GetMax(
                    imageRequest.LowestPermittedRequestLevel,
                    lowestPermittedRequestLevelOnSubmit);

                SettableProducerContext settableProducerContext = new SettableProducerContext(
                    imageRequest,
                    GenerateUniqueFutureId(),
                    requestListener,
                    callerContext,
                    lowestPermittedRequestLevel.Value,
                    /* isPrefetch */ false,
                    imageRequest.IsProgressiveRenderingEnabled ||
                    !UriUtil.IsNetworkUri(imageRequest.SourceUri),
                    imageRequest.Priority);

                return(CloseableProducerToDataSourceAdapter <T> .Create(
                           producerSequence,
                           settableProducerContext,
                           requestListener));
            }
            catch (Exception exception)
            {
                return(DataSources.ImmediateFailedDataSource <CloseableReference <T> >(exception));
            }
        }
        /// <summary>
        /// @deprecated Use GetDataSourceSupplier(ImageRequest imageRequest,
        /// object callerContext, RequestLevel requestLevel) instead.
        /// </summary>
        public ISupplier <IDataSource <CloseableReference <CloseableImage> > > GetDataSourceSupplier(
            ImageRequest imageRequest,
            object callerContext,
            bool bitmapCacheOnly)
        {
            RequestLevel requestLevel = bitmapCacheOnly ?
                                        new RequestLevel(RequestLevel.BITMAP_MEMORY_CACHE) :
                                        new RequestLevel(RequestLevel.FULL_FETCH);

            return(GetDataSourceSupplier(imageRequest, callerContext, requestLevel));
        }
示例#4
0
    void LoadRes(int abIndex, RequestLevel level)
    {
        ResourceManager.Instance.GetResource("u3d" + abIndex + ".u3d", "obj", (obj) => {
            j++;
            print("----->" + obj.name);
            //Instantiate(obj);

            if (j == 999)
            {
                print("花费时间-------" + (Time.time - start).ToString());
            }
        }, level);
    }
 /// <summary>
 /// Returns an IDataSource supplier that will on get submit
 /// the request for execution and return an IDataSource
 /// representing the pending results of the task.
 /// </summary>
 /// <param name="imageRequest">
 /// The request to submit (what to execute).
 /// </param>
 /// <param name="callerContext">
 /// The caller context of the caller of data source supplier.
 /// </param>
 /// <param name="requestLevel">
 /// Which level to look down until for the image.
 /// </param>
 /// <returns>
 /// An IDataSource representing pending results and completion
 /// of the request.
 /// </returns>
 public ISupplier <IDataSource <CloseableReference <CloseableImage> > > GetDataSourceSupplier(
     ImageRequest imageRequest,
     object callerContext,
     RequestLevel requestLevel)
 {
     return(new SupplierImpl <IDataSource <CloseableReference <CloseableImage> > >(
                () =>
     {
         return FetchDecodedImage(imageRequest, callerContext, requestLevel);
     },
                () =>
     {
         return $"{ base.ToString() }{{uri={ imageRequest.SourceUri.ToString() }}}";
     }));
 }
示例#6
0
    // Use this for initialization
    void Start()
    {
        print("本次加载1000个资源");
        start = Time.time;
        for (int i = 0; i < 1000; i++)
        {
            int          ramdomIndex = Random.Range(1, 5);
            float        ramdomLevel = Random.Range(1, 3);
            RequestLevel level       = ramdomLevel == 1 ? RequestLevel.High : RequestLevel.Low;

            LoadRes(ramdomIndex, level);
        }
        //for (int i = 0; i < 100; i++)
        //{
        //    LoadRes(1, RequestLevel.High);
        //}
    }
        /// <summary>
        /// Submits a request for execution and returns an IDataSource
        /// representing the pending decoded image(s).
        /// <para />The returned DataSource must be closed once the
        /// client has finished with it.
        /// </summary>
        /// <param name="imageRequest">
        /// The request to submit.
        /// </param>
        /// <param name="callerContext">
        /// The caller context for image request.
        /// </param>
        /// <param name="lowestPermittedRequestLevelOnSubmit">
        /// The lowest request level permitted for image request.
        /// </param>
        /// <returns>
        /// An IDataSource representing the pending decoded image(s).
        /// </returns>
        public IDataSource <CloseableReference <CloseableImage> > FetchDecodedImage(
            ImageRequest imageRequest,
            object callerContext,
            RequestLevel lowestPermittedRequestLevelOnSubmit)
        {
            try
            {
                IProducer <CloseableReference <CloseableImage> > producerSequence =
                    _producerSequenceFactory.GetDecodedImageProducerSequence(imageRequest);

                return(SubmitFetchRequest(
                           producerSequence,
                           imageRequest,
                           lowestPermittedRequestLevelOnSubmit,
                           callerContext));
            }
            catch (Exception exception)
            {
                return(DataSources.ImmediateFailedDataSource <CloseableReference <CloseableImage> >(exception));
            }
        }
 public Handler(RequestLevel level)
 {
     HandlerLevel = level;
 }
 public Request(RequestLevel level, string msg)
 {
     reqLevel = level;
     message = msg;
 }
示例#10
0
    private IEnumerator GetRes_Cor(string abName, string fileName, Action <UnityEngine.Object> func, RequestLevel level = RequestLevel.Low)
    {
        //目标资源请求
        ResourceRequest resourceRequest = new ResourceRequest();

        //print("70------>" + loadedABClass.ContainsKey(abName));
        //如果当前包名存在loadedABClass ,减少反复的LoadFromFileAsync
        if (loadedABClass.ContainsKey(abName))
        {
            //直接就从以获取包名中获得封装AB包
            //设置等待,当第一次加载成功后再继续
            while (loadedABClass[abName] == null)
            {
                //print("loading    " + abName+"    "+ loadedABClass[abName]);
                yield return(new WaitForEndOfFrame());
            }
            //print(loadedABClass[abName]);
            var myab = loadedABClass[abName];

            resourceRequest.abName     = abName;
            resourceRequest.fileName   = fileName;
            resourceRequest.func       = func;
            resourceRequest.level      = level;
            resourceRequest.resourceAB = myab;
        }
        //当前没加载过这个包
        else
        {
            //某个ab包占位,开始加载
            loadedABClass.Add(abName, null);
            //TODO加载所有依赖包

            //根据传进来的ab包名 加载ab包
            AssetBundleCreateRequest abRequest = AssetBundle.LoadFromFileAsync(fileMain + abName);
            // print(fileMain + abName);
            //等待协程返回
            yield return(abRequest);

            if (abRequest.assetBundle == null)
            {
                //停止协程--没有加载到ab包
                Debug.LogError("加载失败,没有找到对应的ab包");
                yield break;
            }

            //该请求的request对象封装
            resourceRequest.abName     = abRequest.assetBundle.name;
            resourceRequest.fileName   = fileName;
            resourceRequest.func       = func;
            resourceRequest.level      = level;
            resourceRequest.resourceAB = new ResourceABClass(abRequest.assetBundle);

            //将当前加载成功的ab包,放入dic维护,下次可以直接使用
            //print("112----->" + abName);


            loadedABClass[abName] = new ResourceABClass(abRequest.assetBundle);

            //print("115------>" + loadedABClass.ContainsKey(abName));
            //新建一个资源加载请求

            //--print(request.assetBundle.name);

            //将资源加载请求resourceRequest放到资源中心队列中 根据优先等级
        }

        if (level == RequestLevel.High)
        {
            resourceRequests_high.Enqueue(resourceRequest);
        }
        else
        {
            resourceRequests_low.Enqueue(resourceRequest);
        }

        yield break;
    }
示例#11
0
 /// <summary>
 /// 根据ab包名获取对应的文件资源——高级
 /// </summary>
 /// <param name="abName">包名</param>
 /// <param name="fileName">文件名</param>
 /// <param name="func">回调函数</param>
 public void GetResource(string abName, string fileName, Action <UnityEngine.Object> func, RequestLevel level = RequestLevel.Low)
 {
     //
     StartCoroutine(GetRes_Cor(abName, fileName, func, level));
 }