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