Unity5資源管理的又一次探討

對於Unity來說,常用的資源管理有2種方式,一種是包內的Resources資源,一種是外部的AssetBundle加載。之前我在博客裏面寫了很多篇文章來介紹AssetBundle的使用方法和加載策略。按道理來說,這套東西暫時還用得挺好,不過有一個問題就是,打出去的assetbundle文件,不管你是打包成zip包放在安裝包一起出去,然後第一次啓動的時候解壓縮,還是直接把assetbundle放到網上的cdn,然後用的時候才下載,都會讓人感覺到有點不爽。
我自己的做法就是把assetbundle文件打包成zip包,然後第一次啓動的時候解壓縮。有補丁的時候再從網上下載補丁包解壓縮。這樣的流程本來是挺好的,但唯一的問題就是第一次啓動的解壓縮會有點討厭。資源多的情況下,在紅米Note一代這樣的機器上面解壓縮差不多要1分鐘。這樣的體驗不是特別的好。
爲了減少解壓縮時間,我做了些嘗試。
如果我們所有資源都在Resource內部的話,就可以完全沒有解壓縮過程了。(當然只是指資源,lua腳本還是必須解壓縮的)剛好這時候有位網友問我,如果把資源都整包的放在Resource裏面,然後只有改動的東西做成補丁包放在外部,這樣的策略是否可行。我感覺是可行的,當時沒有考慮太多,唯一擔心的是整包出的包容量會不會比自己把Assetbundle打Zip包要大。嘗試的結果是,很容易就做完了,而且容量反而更小。比如一個項目的所有美術資源的assetbundle有200M的,如果自己打zip包放安裝包裏面,發佈apk的容量大概是80多M左右,但如果放在整包Resource裏面發包,apk的容量才70M左右。
具體的做法是,把需要打assetbundle的美術資源預設等都直接放在項目的Resources文件夾裏面,然後寫個自動化工具將Resources文件夾裏面的內容自動的設置assetbundleName。那樣直接發佈安裝包,就會包含所有Resources裏面的內容了,然後需要的時候Build一次assetbundle,然後記錄assetbundle的哈希碼,用於打補丁包時作對比。最後在加載的時候,先檢查需要加載的文件是否需要外部加載,如果要,就讀補丁包裏面的assetbundle,如果不要,就直接Resource裏面load出來。
這樣的做法挺簡單,也挺舒服的。不過後來發現了一個比較不好解決的問題。比如有十個模型都公用了一張貼圖。按照正常的情況,我們如果修改了這一張公用的貼圖後,只需要把該貼圖單獨的打包成補丁包就行了。但如果用了上面那種方式後,你要加載這十個模型,又想用到新的那張貼圖,那你就只能把十個模型的assetbundle都打包成補丁包了。因爲從簡單來說,這十個模型在Resource裏面都有完整的預設和資源,在load的時候完全不需要檢查外部的圖片,所以單獨改變了圖片,它根本不知道!包括了UI用到的圖片也是一樣的道理了。
其實要解決這一問題的方法也是有的,比如我們寫一個工具,把Resources裏面的資源都做一個配置記錄,裏面記錄了該模型資源用到了哪些依賴的資源,比如一個UI用到了哪些圖集、一個模型用到了哪些材質、貼圖等。然後加載的時候,不完全信任預設,而是把這些記錄下來的依賴資源逐個去檢查是否需要外部加載,如果需要就重新賦值。但我感覺這樣的做法有點本末倒置。在大部分的情況下,我們直接load出一個模型就能直接用了,完全沒有額外的消耗。但現在爲了預防一些依賴被外部資源替代了,我就不論黑白的把所有的資源都重新檢查一遍。注意這種消耗是每次加載資源都會產生的。
解決這個問題的另外一個方法是,每一個資源預設的資源規劃都是獨立的,他們之間沒有任何的公用。這樣的情況下,我一個資源的依賴資源發生改變,直接把整個資源預設打包一個獨立的assetbundle更新包出去,對其他預設沒有任何影響。不過這個辦法對資源劃分有點高要求,不適合用在UI之類公用資源特別多的地方。我覺得適合用在比如格鬥遊戲出新角色的DLC等。
所以最後我還是放棄了這種做法,恢復到解壓縮assetbundle的zip包。
那麼要解決解壓縮時間長的問題,就只能從解壓縮的文件數量裏面下手了。
之前也曾經說過,assetbundle拆分的力度問題。其實這是一個很多技巧和坑在裏面的過程。拆的過散,會導致碎片文件太多,導致加載消耗大、解壓縮時間長。拆得不夠散,會導致文件冗餘多,包容量變大。所以要拆到剛剛好才行。這個問題我之前說過方法,但後來被某位網友指出有漏洞,我將會另外再獨立的探討這個問題。

發佈了69 篇原創文章 · 獲贊 79 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章