1. 程式人生 > >Unity伺服器熱更新專案總結

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.              

所以AssetBundle實質上是Web Stream解壓後的檔案中各個物件的對映。而非真實的物件。

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.251),因此載入完 Object 後,webstream需要及時釋放

Ø        幾種AssetBundle建立方式的差異:
CreateFromFile:
這種方式不會把整個硬碟AssetBundle檔案都載入到記憶體來,而是類似建立一個檔案操作控制代碼和緩衝區,需要時才實時Load,所以這種載入方式是最節省資源的,基本上AssetBundle本身不佔什麼內存,只需要Asset物件的記憶體。可惜只能在PC/MacStandalone程式中使用。CreateFromMemorywww.assetBundle:這兩種方式AssetBundle檔案會整個映象於記憶體中,理論上檔案多大就需要多大的記憶體,之後Load時還要佔用額外記憶體去生成Asset物件

4.建議unity所有的資源命名的時候用小寫,下劃線,數字,儘量不要用大寫

5. www下載注意事項

    privateIEnumerator DownLoad(string url, HandleFinishDownload finishFun)

    {

        WWW www = new WWW(url);  //此處url 檔案要完整的字尾,比如:model.unityxml.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>