被www.dispose给坑了

本文介绍了使用Unity进行AssetBundle资源下载时如何优化超时判断,并讨论了处置未完成下载任务时遇到的问题及解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做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

转载于:https://www.cnblogs.com/codingnow/p/4570428.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值