码迷,mamicode.com
首页 > 其他好文 > 详细

被www.dispose给坑了

时间:2015-06-12 00:29:31      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

在做AssetBundle资源更新时, 用的是Unity自带的WWW进行下载, 考虑到网络卡的情况下, 做了超时操作.

之前是直接在Update中用Time.time来判断, 假设超过一定时间, www仍未完成,则判断为超时. 其实这样做

虽然也可以说完成了超时判断, 但是TIME_OUT时间设置不好拿捏, 有时候网络真的比较慢的情况下, 下载操作确实比较耗时.

后面无意中发现了www.progress这个属性, 才改成根据progress来判断.

 1 public class DownloadTask
 2 {
 3     public WWW request;
 4     public float beforeTime;
 5     public float beforeProgress;
 6 
 7     public DownloadTask(string url, float time)
 8     {
 9         this.beforeTime = time;
10         this.request = new WWW(url);
11     }
12 
13     public bool CheckTimeOut()
14     {
15         float now = Time.time;
16         if (now - beforeTime > TIME_OUT) return true;
17 
18         if (request.progress != beforeProgress)
19         {
20             beforeTime = now;
21             beforeProgress = request.progress;
22         }
23         return false;
24     }
25 }  

 

说了超时判断, 现在主要讲下www.dispose的坑.

在下载AssetBundle过程中, 我开了几个www同时下.如果完成或者超时我都会把它放入完成队列中, 进行删除跟dispose释放资源.

可就在dispose因超时而被我放入完成队列里的www的时候, 造成很游戏画面严重的卡顿. 根据下载的文件大小, 卡顿时间不同.

经过Profile的Deep Profile才发现是www.dispose的问题, 实在是大坑, 折腾了好久...

(额外说下, Unity的Profile工具确实给开发者带来很大方便, 优化性能时必选工具)

 

最后小结下:dipose掉完成下载的www不会有问题, 但是却不能dispose仍在下载的www.

当然你也可以不去人为操作Dispose,因为Unity会在适当的时机释放掉www资源.

 

以上.

想了解更多, 可参考:http://bbs.9ria.com/thread-144574-1-1.html

被www.dispose给坑了

标签:

原文地址:http://www.cnblogs.com/codingnow/p/4570428.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!