發表文章

目前顯示的是 6月, 2018的文章
Related Posts Plugin for WordPress, Blogger...

6-32 AssetBundle Unload And Browser tool

圖片
本章要來介紹AssetBundle的卸載機制,以及官方提供的AssetBundle瀏覽工具。首先,如果將遊戲物件從場景中Destroy,Unity也不會自動卸載AssetBundle,即便你後面都不使用,已載入的AssetBundle仍占用記憶體。 除非你更換場景(Scene),更換的時候Unity會自動Destroy所有場景中的遊戲物件,並接著呼叫Resources.UnloadUnusedAssets,這個函數會將沒有用到的Asset從記憶體中卸載。 所以,當我們想要手動卸載不需要的Asset時該怎麼做?可以使用AssetBundle.Unload(bool)這個函數。這個函數依據布林值有兩種用法: AssetBundle.Unload(true):卸載指定的AssetBundle中的Asset。 AssetBundle.Unload(false):卸載指定的AssetBundle中的Asset,但已加載到場景中的Asset將維持不變。 Unity官方並不建議使用AssetBundle.Unload(false),因為管理不當的話,有可能導致場景中有多份以上的相同Asset。 以下引用Unity官方文檔的圖進行解說。當使用AssetBundle.Unload(false)進行卸載時,場景中已使用的Material不會跟著卸載,AssetBundle與Material之間的Link會切斷。 重新讀取AssetBundle後,Unity不會重新將遺留在場景中的Material與AssetBundle連結起來。 假如場景中再度要使用AssetBundle內的Material時,此時的場景上會有兩份相同的Material,這樣就會有浪費記憶體的問題。 我們可以用程式碼來測試這個現象。首先,我使用AssetBundle讀取資源,使用Instantiate於場景中產生資源,接著呼叫assetBundle.Unload(false),使用false的話,不會影響場景中已經被產生出來的資源。 所以,於遊戲中可以看到,即便使用AssetBundle.Unload(false),房屋模型依舊存在。 接著我要再度載入相同的AssetBundle,並產生一個相同的房屋模型,放置在原本的房屋模型的旁邊。 這時的遊戲

6-31 Using AssetBundles Natively And UnityWebRequest

圖片
本章要來介紹在Unity使用AssetBundle的四種方法。 AssetBundle.LoadFromMemory AssetBundle.LoadFromFile WWW.LoadfromCacheOrDownload UnityWebRequest’s DownloadHandlerAssetBundle (Unity 5.3 or newer) 第一種是透過記憶體載入AssetBundle,比方說從網路上下載的檔案是bytes陣列,可以直接使用LoadFromMemoryAsync轉換成AssetBundle。 Unity官方不建議使用此API,原理上至少會佔用三倍AssetBundle的容量於記憶體內。 第二種是從本地載入AssetBundle。如AssetBundle為LZ4壓縮格式,則只會載入 AssetBundle 的檔頭,其餘的資料仍留存在硬碟上,將會基於「按需求 (on-demand)」的模式來載入。 第三種是從網路上下載AssetBundle後,在本地緩存並載入。*注意:從Unity 2017.1開始,第三種方法只是包裝自UnityWebRequest。 因此, 使用Unity 2017.1或更高版本的開發人員應改用UnityWebRequest 。* 與UnityWebRequest不同,每次調用此API都會產生一個新的工作線程。 因此,在移動設備等內存有限的平台上,每次只能使用此API下載一個AssetBundle,以避免內存高峰。如果需要下載超過5個AssetBundle,請使用代碼創建和管理下載隊列,以確保只有少量AssetBundle下載正在同時運行。 第四種是從Unity 5.3以後才支援的功能,用來處理從網路上下載的AssetBundle。使用DownloadHandlerAssetBundle下載時,下載的數據會傳輸到固定大小的緩衝區,然後根據不同的配置方式,決定將緩衝的數據放到暫存空間或AssetBundle緩存空間。 以上操作都以native-code形式進行,消除了擴展heap的風險。 上述解說來自這篇官方文檔,也推薦大家閱讀這篇文檔,會獲得非常大的幫助: https://unity3d.com/learn/tutorials/topics/best-practic

6-30 AssetBundle Option And Manifest File

圖片
本章要來介紹AssetBundle的打包選項,官方的詳細文檔可參考如下網址: https://docs.unity3d.com/Manual/AssetBundles-Building.html 不過同樣要來替大家解釋一下各種打包效果如何。首先從程式碼看,BuildAssetBundleOptions在如下用紅色框起來的地方進行設定。 BuildAssetBundleOptions.None:使用LZMA算法壓縮,壓縮的包更小,但是加載時間更長。使用之前需要全部解壓縮,解壓縮完畢以後會自動使用LZ4算法重新壓縮並儲存到本地端,所以使用資源的時候不需要全部解壓縮。 BuildAssetBundleOptions.UncompressedAssetBundle:不壓縮,容量大,但加載時間最快。 BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4算法壓縮,容量比LZMA壓縮後還大,但好處是使用資源時不用全部解壓縮,只要解壓縮所需的『Chunk』部分即可,因此又被稱為Chunk-Based演算法。 如果使用LZ4算法壓縮,加載速度與不加縮的方法一樣快,但容量比不壓縮還小。 以下實際幫大家檢驗看看。 使用 BuildAssetBundleOptions.None 使用 BuildAssetBundleOptions. ChunkBasedCompression 使用 BuildAssetBundleOptions. UncompressedAssetBundle 上述三種只是Unity官方文檔介紹的基礎選項,實際上在 BuildAssetBundleOptions內還有更多的選項,大家可以從以下網址查看更詳細的內容: https://docs.unity3d.com/ScriptReference/BuildAssetBundleOptions.html 下列我幫大家針對官方的說明進行翻譯,但不會有實例示範。 DisableWriteTypeTree 將使AssetBundle易受腳本或Unity版本更改的影響,但文件更小,加載速度更快。此標誌僅影響默認包含類型信息的平台的AssetBundles。 例如,Web平台必須存在類型信息,如果在構建BuildTa

6-29 Asset Assignment Strategies

圖片
本章要來介紹AssetBundle的分組策略,以下只有文字介紹,會稍嫌無聊一點。我會擷取部份重點進行翻譯,供大家參考,詳細官方文檔可參考如下網址: https://docs.unity3d.com/Manual/AssetBundles-Preparing.html https://unity3d.com/learn/tutorials/topics/best-practices/assetbundle-usage-patterns Deciding how to divide a project's assets into AssetBundles is not simple. It is tempting to adopt a simplistic strategy, such as placing all Objects in their own AssetBundle or using only a single AssetBundle, but these solutions have significant drawbacks: Having too few AssetBundles... Increases runtime memory usage Increases loading times Requires larger downloads Having too many AssetBundles... Increases build times Can complicate development Increases total download time The key decision is how to group Objects into AssetBundles. The primary strategies are: Logical entities Object Types Concurrent content 有一種很簡單的分組策略方式,比如將資源分別放置在單獨的AssetBundle中,或將所有資源都打包於一個AssetBundle中,但這樣的分組策略具有明顯的缺點: 擁有太少的AssetBundles ... 1. 增加運行時內存使用量 2. 增加加載時間 3.

6-28 Introduction To AssetBundle

圖片
本章要開始進入AssetBundle的教學了。由於遊戲中的場景資源容易占用許多容量,導致我們輸出成Android, iOS的安裝包時的容量過大,所以我們可以將資源額外打包為資源包,節省安裝包的容量。待玩家開啟遊戲後再從Server下載資源包,這種做法在遊戲更新的時候也非常方便,僅更新資源的話就不需要重新上架安裝包,更新資源包即可。 建議從Untiy官方文檔中了解AssetBundle的相關資訊,我下面也會提供翻譯給大家參考。 https://docs.unity3d.com/Manual/AssetBundlesIntro.html https://docs.unity3d.com/Manual/AssetBundles-Preparing.html https://docs.unity3d.com/Manual/AssetBundles-Building.html https://docs.unity3d.com/Manual/AssetBundles-Native.html An AssetBundle is an archive file containing platform specific Assets (Models, Textures, Prefabs, Audio clips, and even entire Scenes) that can be loaded at runtime. AssetBundles can express dependencies between each other; e.g. a material in AssetBundle A can reference a texture in AssetBundle B. For efficient delivery over networks, AssetBundles can be compressed with a choice of built-in algorithms depending on use case requirements (LZMA and LZ4). AssetBundles can be useful for downloadable content (DLC), reducing initial install