被www.dispose给坑了

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C# 中,`Dispose` 方法用于释放资源,特别是实现了 `IDisposable` 接口的对象。通过调用 `Dispose` 方法,可以确保对象所占用的资源被及时释放,以避免资源泄漏和内存泄漏。 对于网络编程中使用的端口(Port)对象,如果它实现了 `IDisposable` 接口,你可以调用 `Dispose` 方法来释放相关资源。这通常在你使用完端口后,或者在不再需要端口时调用。 以下是一个示例: ```csharp using System; using System.Net; class Program { static void Main(string[] args) { // 创建一个 Socket 对象并使用端口 1234 var port = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); port.Bind(new IPEndPoint(IPAddress.Any, 1234)); // 在完成使用后调用 Dispose 方法释放资源 port.Dispose(); } } ``` 在上面的示例中,我们创建了一个 Socket 对象,并使用端口号 1234 进行绑定。在完成使用后,我们调用 `Dispose` 方法释放资源。 需要注意的是,在调用 `Dispose` 方法后,你就不能再使用该对象进行任何操作。因此,在调用 `Dispose` 方法之前,确保你已经完成了所有需要使用该对象的操作。 此外,为了方便资源的自动释放,你也可以使用 `using` 语句块来自动调用 `Dispose` 方法。例如: ```csharp using (var port = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { port.Bind(new IPEndPoint(IPAddress.Any, 1234)); // 使用 port 对象进行操作 } // 在 using 语句块结束后,会自动调用 Dispose 方法释放资源 ``` 通过使用 `using` 语句块,可以确保资源在使用完毕后自动释放,无需手动调用 `Dispose` 方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值