被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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM