Unity伺服器熱更新專案總結
1. 當下載unity3D、txt、xml檔案時,切記在IIS中新增相應的MIME型別,否則會出現400錯誤
2. www、bundleAsset、Asset之間的關係:
1. WebStream:包括了壓縮的檔案,解壓所需的快取,以及解壓後的檔案。(但實際測試的時候www並不佔用太多記憶體,感覺是資源的引用)
2. AssetBundle:Web Stream中的檔案的對映,或者說引用。(實際測試時:將資源釋放到記憶體中)
3. 例項化之後的物件:就是引擎的各種資原始檔了,會在記憶體中創建出來。
那就分別解析一下:
1 |
WWW www = WWW.LoadFromCacheOrDownload (BundleURL, version) |
1. 將壓縮的檔案讀入記憶體中
2. 建立解壓所需的快取
3. 將檔案解壓,解壓後的檔案進入記憶體
4. 關閉掉為解壓建立的快取
1 |
AssetBundle bundle = www.assetBundle; |
1. AssetBundle此時相當於一個橋樑,從Web Stream解壓後的檔案到最後例項化建立的物件之間的橋樑。
2.
3. 實際的資源還存在Web Stream中,所以此時要保留Web Stream。
1 |
Instantiate(bundle.mainAsset); |
通過AssetBundle獲取資源,例項化物件
最後各位可能看到了官網中的這個例子使用了:
1 2 |
using(WWW www = WWW.LoadFromCacheOrDownload (BundleURL, version)){ } |
這種using的用法。這種用法其實就是為了在使用完Web Stream之後,將記憶體釋放掉的。因為WWW也繼承了idispose的介面,所以可以使用using的這種用法。其實相當於最後執行了:
1 2 |
//刪除Web Stream www.Dispose(); |
OK,Web Stream被刪除掉了。那還有誰呢?對Assetbundle。那麼使用
1 2 |
//刪除AssetBundle bundle.Unload(false); |
ok,寫到這裡就先打住啦。寫的有點超了。有點趕也有點臨時,日後在補充編輯。
3.
Ø 資源管理器類,UnloadUnusedAsset函式保證只有在真正有資源需要解除安裝的時候才呼叫Resources.UnloadUnusedAssets();
有一點需要注意的地方就是,在資源解壓完成後,一定要記得要釋放壓縮包記憶體,即:
www.assetBundle.LoadAsync(GetAssetName(name),type);
www.assetBundle.Unload(false);
因為,www壓縮包資料只能手動解除安裝,跳轉場景都不會刪除,所以載入完立即unload是一個好習慣。
還有一點需要注意的www.assetBundle.mainAsset是一個同步載入的操作,也就是說呼叫此函式時會卡。
Ø 在測試情況下你可能會頻繁的打包生成Assetbundle,如果忘記改版本號的話可能會讀取之前的快取,可能就會看不到新的效果,所以我建議在bunild Assetbundle的時候強制清空一下快取。
Caching.CleanCache();
Ø AssetBundle本身的資源我們統稱為 webstream,這部分記憶體和加載出來的 GameObject 需要的資源記憶體量相當(webstream:Object ~= 1.25:1),因此載入完 Object 後,webstream需要及時釋放。
Ø 幾種AssetBundle建立方式的差異:
CreateFromFile:這種方式不會把整個硬碟AssetBundle檔案都載入到記憶體來,而是類似建立一個檔案操作控制代碼和緩衝區,需要時才實時Load,所以這種載入方式是最節省資源的,基本上AssetBundle本身不佔什麼內存,只需要Asset物件的記憶體。可惜只能在PC/MacStandalone程式中使用。CreateFromMemory和www.assetBundle:這兩種方式AssetBundle檔案會整個映象於記憶體中,理論上檔案多大就需要多大的記憶體,之後Load時還要佔用額外記憶體去生成Asset物件。
4.建議unity所有的資源命名的時候用小寫,下劃線,數字,儘量不要用大寫
5. www下載注意事項
privateIEnumerator DownLoad(string url, HandleFinishDownload finishFun)
{
WWW www = new WWW(url); //此處url 檔案要完整的字尾,比如:model.unity或xml.txt,否則//找不到下載檔案會出現cont open file
www.threadPriority= ThreadPriority.High;
//WWW www = WWW.LoadFromCacheOrDownload(url, -1);
if(url.Contains("jpg"))
{
Debug.Log("jpg!");
}
yieldreturnwww; //要返回www,否則www儲存不到記憶體中
if(!string.IsNullOrEmpty(www.error))
{
Debug.LogError("www.error is "+ www.error);
yieldbreak;
}
if(finishFun != null) //yield return www 是同步方法,www下載完畢後會執行到此!
{
finishFun(www);
}
//如果www完成且,down的下載次數與總任務相同,則開始使用board中的圖片替換場景中同名model的貼圖
if(www.isDone && downNum == NeedDownFiles.Count)
{
boardAllTextureLoadA(); //此時並沒有完成
}
www.Dispose();
}
5.
A.在是用uinty5.0進行.unity3D包釋出的時候,會將該包的hash資料同時生成,在客戶端載入的時候可以根據hash值來進行增量式熱跟新。
B. 在客戶端進行載入的時候,要讀取asset打包時生成的window檔案(切記不是window.Manifest檔案),然後根據每個unity3D包的hash值進行熱跟新
6. IIS上搭建下載資料夾的時候要加入crossdomain.xml檔案:
<?xml version="1.0"?>
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" />
<allow-access-from domain="*" to-ports="10000"/>
</cross-domain-policy>