【Unity3d】【项目学习心得】从资源服务器下载资源(二)

【Unity3d】【项目学习心得】从资源服务器下载资源(二)


继上篇的基础准备 从资源服务器下载资源(一) 

我们现在继续进一步完成 LoadManager 管理类。

管理类因为在全局中都是存在的,所以应该作为单例存在。

因为LoadManager 类是管理多个 LoadRequest的,所以我们需要存储当前正在下载的LoadRequest,以及下载完成的 LoadRequest。

另外,我们为了防止太多下载线程占用过多资源,我们对于下载的线程个数做一定的限制,如项目里面的最大线程数为2,所以我们需要一个存储LoadRequest的等待队列。

根据以上分析,分别如下:

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public static LoadManager instance;  
  2.    public int MAX_LOAD_REQUEST = 2;  
  3.   
  4.    private Dictionary<string, LoadRequest> loadDict = new Dictionary<string, LoadRequest>();  
  5.    private Dictionary<string, LoadRequest> waitDict = new Dictionary<string, LoadRequest>();  
  6.    private Dictionary<string, LoadParam> completeDict = new Dictionary<string, LoadParam>();  

另外,既然有下载队列的存在,就有下载优先级,我们可以多一个存储下载任务的优先级,然后根据优先级进行下载。

当然,项目里面虽然有了下载优先级的存储,但是并没有进行排序,在进行下载任务创建的时候,也都统一使用了Normal优先级。

所以在此我们先跟着创建,等到以后需要使用优先级的时候再进行排序。

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private List<string> priorityList = new List<string>();  

接下来我们开始实现代码:

1. 首先实现单例:

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /// <summary>  
  2. ///  返回实例  
  3. /// </summary>  
  4. /// <returns></returns>  
  5. public static LoadManager getInstance() {  
  6.     if (instance == null) {  
  7.         instance = new LoadManager();  
  8.     }  
  9.     return instance;  
  10. }  

2. 我们实现一个函数,功能是根据优先级,从等待队列里面移除一个任务到下载队列里。

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /// <summary>  
  2. /// 根据优先级,从等待队列里面移除一个任务到下载队列里  
  3. /// </summary>  
  4. public void MoveRequestFromWaitDictToLoadDict() {  
  5.     isLoading = loadDict.Count > 0;  
  6.     if (priorityList.Count > 0) {  
  7.         if (waitDict.ContainsKey(priorityList[0])) {  
  8.             LoadRequest request = waitDict[priorityList[0]];  
  9.             waitDict.Remove(priorityList[0]);  
  10.             priorityList.RemoveAt(0);  
  11.             Load(request.requestURL, request.completeFunction, request.customParams, request.fileType, request.priotiry, request.errorFunction, request.processFunction);  
  12.         }  
  13.     }  
  14. }  


3.上面的Load()函数是加载新的LoadRequest。

在加载新的LoadRequest时,我们要进行判断,例如同个下载任务可能是由不同的组件请求发起的;

① 这个时候我们当然不能再去下载一次,所以只需判断completeDict里面是否已经下载过了,如果是,就直接使用即可。

② 另外,当有相同的请求时,不过此时下载还没完成(正在下载中),此时我们只需把回调函数加进回调队列即可。

③ 相同的,如果相同的请求在等待队列,也跟②一样处理。

④ 最后就剩下是,从没下载过的情况,此时我们要看当前下载的线程是否超过最大限制,如果是,则把任务加到等待队列,如果不是,则可马上下载

具体实现为下:


[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /// <summary>  
  2.     /// 读取资源  
  3.     /// </summary>  
  4.     public void Load(string url, LoadRequest.DownCompleteDelegate completeFunc, object customParam = nullstring fileType = ""int  priority = 2, LoadRequest.ErrorDelegate errorFunc = null, LoadRequest.ProcessDelegate processFunc = null) {  
  5.         url = url.Trim();  
  6.         if (string.IsNullOrEmpty(url)) return;  
  7.          
  8.         if (completeDict.ContainsKey(url)) {  
  9.             // 已下载资源,直接调用回调函数  
  10.             if (customParam != null) {  
  11.                 completeDict[url].param = customParam;  
  12.             }  
  13.             try {  
  14.                 completeFunc.Invoke(completeDict[url]);  
  15.             } catch (Exception exception) {  
  16.                 Debug.LogWarning("exception:" + exception.Message);  
  17.             }  
  18.         } else if (loadDict.ContainsKey(url)) {  
  19.             // 已经提交相同请求,但是没有下载完成  
  20.             loadDict[url].completeFunction += completeFunc;  
  21.             loadDict[url].processFunction += processFunc;  
  22.             loadDict[url].errorFunction += errorFunc;  
  23.             loadDict[url].customParams.Add(customParam);  
  24.         } else if (waitDict.ContainsKey(url)) {  
  25.             // 已经提交相同请求,但是还没轮到加载  
  26.             loadDict[url].completeFunction += completeFunc;  
  27.             loadDict[url].processFunction += processFunc;  
  28.             loadDict[url].errorFunction += errorFunc;  
  29.             loadDict[url].customParams.Add(customParam);  
  30.         } else {  
  31.             // 未加载过的  
  32.             if (loadDict.Count < MAX_LOAD_REQUEST) {  
  33.                 isLoading = true;  
  34.                 LoadRequest loadRequest = new LoadRequest(url, customParam, fileType, completeFunc, errorFunc, processFunc);  
  35.                 if (customParam != null && customParam.GetType().ToString() == "System.Collections.Generic.List`1[System.Object]") {  
  36.                     loadRequest.customParams = (List<object>)customParam;  
  37.                 }  
  38.                 loadDict.Add(url, loadRequest);  
  39.             } else {  
  40.                 // 已达到最大加载数目,加入等待队列  
  41.                 LoadRequest loadRequest = new LoadRequest();  
  42.                 loadRequest.requestURL = url;  
  43.                 loadRequest.completeFunction = completeFunc;  
  44.                 loadRequest.errorFunction = errorFunc;  
  45.                 loadRequest.processFunction = processFunc;  
  46.                 loadRequest.customParams.Add(customParam);  
  47.                 loadRequest.fileType = fileType;  
  48.                 loadRequest.priotiry = priority;  
  49.                 waitDict.Add(url, loadRequest);  
  50.                 priorityList.Add(url);  
  51.                 priorityList = priorityList.OrderBy(s => waitDict[s].priotiry).ToList();  
  52.             }  
  53.         }  
  54.     }  
转载:http://blog.csdn.net/mad2man/article/details/40582267
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值