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)); }
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() }}}"; })); }
// 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; }
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; }
/// <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)); }