标签:
在做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
标签:
原文地址:http://www.cnblogs.com/codingnow/p/4570428.html