unity 基於Assetbundle的更新機制的設計

客戶端資源的管理是一個複雜的問題,這裏描述一下個人一些實踐:編輯器

####一:早期的cocos2dx項目中, 資源之間的依賴關係是寫在代碼裏面的,資源的拼接組裝都是經過代碼進行的,所以遊戲更新,主要經過兩個途徑,即代碼更新和圖片的更新;ui

cocos2dx 支持多個優先級的資源獲取,即從高優先級目錄或者位置首先搜索資源,沒有的話再去低優先級位置搜索資源,這樣sd卡上下載的新資源就會比apk中的舊資源優先加載,而只須要更新sd中資源便可;設計

我對全部資源作了一個md5值,客戶端首先下載md5文件,和本地md5版本比較,找出新加的和更新的文件,挨個下載,最後再更新md5文件便可。遊戲

上述的方案存在問題: 1:資源之間的依賴關係被嵌入到代碼中了,對應簡單的2d遊戲基本是圖片拼接,依賴管理比較簡單,能夠這樣處理 2:資源缺乏整合打包機制,逐個下載和加載資源效率不高,不過2d遊戲仍是能夠容忍的,好處就是資源管理簡單,資源更新很是靈活圖片

####二:unity中資源更新機制內存

1:unity中資源在編輯器中能夠經過guid定位資源而且編輯資源的依賴關係,最後固化到prefab中;最後整個項目的資源就構成 多棵樹木, 樹木的root根節點都放在 Resource目錄下,而樹木的root所依賴的資源放到 Resources目錄外便可。md5

unity中這種資源依賴關係,能夠從Resource目錄中資源開始分析,最後就能夠獲得全部的依賴關係。資源

2:unity 中能夠將多個資源打成一個assetbundle,接着遊戲經過塊加載的方式提升加載速度;這裏就存在一個嚴重的問題,即如何在內存使用和加載速度之間取得平衡呢?當內存不夠加載全部的遊戲資源怎麼辦? 若是內存能夠放下全部的assetbundle,那麼只須要所有加載便可,也就沒有後面的問題了。it

assetbundle對客戶端來說是靜態資源集合,沒法對資源進行拆分和重組織,所以其對應的遊戲機制通常也是靜態資源集合的方式,例如最多見的關卡場景模型,單種場景類型的資源是能夠整合一塊兒加載的。效率

當內存不足,則須要分類資源,對資源進行規劃了。

資源分爲公共資源和特殊使用資源,以及介於二者之間的資源,須要分別控制兩種資源的規模。 其中公共資源須要爲場景特殊資源預留足夠的內存。

在假想的規劃設計中,公共資源即常駐內存資源最多不超過規劃內存總量的50%,而場景資源則佔用剩餘的40%。 接着是一些零散的碎片資源,這些資源的使用介於公共資源和場景獨佔資源之間,即有必定的跨場景使用能力,但這種能力應該要設計低於50%。

經過上面三種分類,接着設計如何分類assetbundle。

#####方案一:全部資源一個 assetbundle,須要設計遊戲內容徹底可內存承載。

#####方案二:最簡單的分類方法,即每一個單一資源對應一個assetbundle即相似於cocos2d中最靈活的方案。

#####方案三:多包機制,資源分類歷來都不是個簡單問題

高級方案則須要對資源分類,採起合適的整合方法:

若是構建合適的規則來對資源進行分類整合呢?

這裏採用人工分類和實踐自動分析結合的方式:

首先資源的Root 樹結構分析能夠找到最終的葉子資源;這些資源是無依賴資源,存在多種資源對其有需求,例如一個shader資源,可能有多個材質都須要使用;這種資源頗有多是屬於公用資源的,例如其使用率高於50%便可認爲是公用資源,例如UI資源。

其它一些葉子節點特殊屬於某類場景,則從葉子節點向上都應該屬於某個場景,相似的,只要咱們肯定某個節點特屬於特定場景,則該節點全部父親節點也特屬於某個場景。則根據場景打包。

相反的咱們有,若某個節點多場景使用,則其全部孩子節點也是多場景使用節點。

####三:遊戲資源的更新 對應於上面分的3類: 其中Common資源會添加,可是更新頻率應該要控制較低,COmmon中UI類又屬於高頻度更新,應該儘可能控制使用現有資源製做新的UI,而不是添加新的資源。shader資源也屬於公用性資源,特殊針對某個模型的shader除外。

而場景獨佔資源是對遊戲內容的擴充,頻繁更新;

跨場景資源,流動性中等,推薦採用單資源單assetbundle模式,例如新的職業角色,新的怪物等。

####四:後期如何調整資源分類,如何更新資源 資源分類應該有一種自適應的方案來進行,隨着遊戲發展而逐漸調整; 咱們添加一個資源到樹中,根據資源所處的父親和孩子節點,得出資源傾向於和父親屬於同一個包便於一塊兒加載,不然須要加載兩個包,若父親包過大 則資源傾向於和全部父親包中資源的孩子構成的兄弟構成一個新包; 若孩子包過大,則資源能夠獨立成包。 這種結構保證了不會發生沉降現象,即父親包 沉入孩子組中。

####五:全部問題的關鍵仍是 公共資源規模控制; 場景特殊資源規模控制; 遊動資源規模控制

相關文章
相關標籤/搜索