AssetBundle系統之(一)打包

2021-10-19 18:23:52 字數 3791 閱讀 3805

系統所做的事情:

1.打包(分析依賴,增量打包)

2.載入(依賴關係載入,多版本支援)

3.解除安裝(自動解除安裝無引用資源)

1.先說一下打包規則

為了打包方便,需要定製一套打包規則。

這裡的規則:

a.基於資料夾的策略打包

b.打包規則分為 selfname(資源自身名字為包名)

c.打包規則分為 fordername(資源所在資料夾為包名)

具體策略:

如圖所示:

預製體放在乙個資料夾,採用selfname。

精靈放在乙個資料夾,採用selfname。

聲音放在乙個資料夾,採用foldername。

(僅僅只是演示,具體策略需要根據專案不同的需求來制定)

(把登陸之前打成乙個group,登陸後釋放;把每個活動打成乙個group等等)

那麼上圖是什麼呢?

就是乙個打包編輯器,可以配置需要匯出的資源。

本質上就是乙個scriptableobject,通過擴充套件編輯器開發個ui介面。

定義乙個assetbundleconfig:

建立乙個

assetbundleconfig config= scriptableobject.createinstance();

assetdatabase.createasset (config, path);

建立後如圖所示:

規則定完後,開始打包。

2.打包邏輯

上圖為快取檔案,第一行是版本號。

然後是資源路徑,資源檔案hash值,資源所在包hash值,依賴數量,如果有的話,下面還有包的hash值。

hash的用處:

1.檔案hash:判斷這個資源是否需要增量打包,通過讀取檔案的byte陣列獲取。

2.包hash:判斷這個包是否需要熱更,通過打包後的assetbundlemanifest檔案獲取。

**b.loadassettargets:**載入所有的資源,構造assettarget物件

為什麼要載入資源?

分析依賴

為什麼5.x還要分析,不是4.x的時候才要分析嗎?

1.為了構建自己的name-assetpath資料表,在編輯器下無需打包就能載入資源。

2.分析是否包含冗餘資源。

假如說:美術偷偷傳了乙個材質的資料夾,他不會配到打包配置裡面,就有很多prefab是依賴這個資源的。所以很多包都會包含這個資源,就會造成資源的冗餘。如果事先分析,發現這種情況,就可以把這個資源,單獨匯出包,讓其他的資源依賴這個包就可以了。

並且只需要設定乙個包名,因為5.x已經幫我們做了依賴管理:如果引用的資源是單獨的包,那就新增乙個依賴項;如果不是,那就把這個資源包含在自己的包內。

那打包的時候設定一下這個材質不就行了嗎?

這只是一種容錯的方法,有些情況是不可預想的。好的團隊按照規則固然重要,但是寫工具要從底層處理問題,而不是依賴認為的策略去解決問題。

assettarget 物件是啥?

如上圖,記錄了:

檔案資訊,對應的資源,以及資源的路徑、被設定的包名、當前的資源名,

以及匯出規則、hash值、快取資訊、我依賴的資源、以及依賴我的資源。

作用:針對單個資源管理

1.包名與資源路徑,在最後build的時候,需要構建assetbundlebuild

2.asset為什麼要載入進來?通過editorutility.collectdependencies(asset)做依賴查詢

(但不是必須的,因為各種元件都會被列出來。可以無需載入asset,直接通過 assetdatabase.getdependencies(path),同樣會獲取到依賴資訊,且是gameobjec級別的。)

3.assetcacheinfo就是檔案build之後的,快取資訊,下一次增量時會根據此比較。

4.依賴我的集合,用來做冗餘剔除,如果數量超過1,就需要單獨匯出包。

5.exportrule匯出規則,就是之前的selfname、foldername,為什麼還會no呢?

如果這個資源沒有設定過需要匯出,且只有乙個包依賴次資源,unity會把這個資源打入到這個包內,而無需匯出。

**c.analyze:**分析依賴,剔除冗餘

1.開始分析,首先要獲取上次的build後的快取資訊。

如果有,並且本次資源的hash值和之前快取的hash值不一樣,那就需要重新匯出。

如果沒有,或者是hash值一樣,那就不需要重新匯出。

會設定 isfilechanged 這個字段,最後匯出時會判斷。

2.通過assetdatabase.getdependencies獲取依賴資訊,把所有的依賴也構建成assettarget進行分析。再把這個資源新增到我依賴的資源中,對這個資源新增依賴它的資源,方便後期做冗餘剔除。

5.當所有的資源都分析過後。

6.對依賴我的資源進行判斷,如果超過2個,就需要單獨匯出,設定包名。

**d.export:**匯出

匯出的過程,就是buildpipeline.buildassetbundles

通過構建assetbundlebuild陣列來構建。而不是直接設定資源的包名。

好處就是如果是git或者svn專案,設定資源的包名就會導致meta檔案變化非常不方便多人協作開發。

壞處就是不能直觀的看到。

並且採用chunkbasecompression的選項,可以載入時實時解壓(速度快,官方推薦)。

**e.end:**結束,儲存資訊

匯出完成後,通重載入assetbundlemanifest,獲取每乙個包的hash值。

再構建依賴關係表,大概的格式就是:(開發模式採用文字格式,發布模式採用二進位制)

結構:assetpath:用於editor下載入。

bundlename:記錄資源對應的包名。

assetname:記錄包內資源名

hash:包的hash值

depcount:依賴數量(如果有,會記錄對應數量的依賴的包名,方便依賴載入)

最後一步,就是刪除無用的ab。也就是上一次打包存在的,本次打包不存在了。

把本次匯出的構建成hashset,讀取打包目錄下的所有檔案,新增到hashset。如果新增成功了,就代表本次沒有,那就需要刪除這個包以及對應生成的manifest檔案。

AssetBundle概念理論(一)

1 ab 的概念 2 ab 的作用 1 相對於 resources 本地資源 來說 ab 包更好管理資源。因為 resouces資料夾下面的所有東西都會被打包。不管有沒有用。在打包以後 是唯讀的檔案。但是 ab 包通過一些處理以後就是 可讀可寫的檔案。ab 包的儲存位置是可以進行自定義的。壓縮方式也...

Assetbundle打包(一) 初步了解

設定好需要打包的各種資源的asserbundle包名以及字尾名 這個設定的方法網上很多教程,這裡不贅述 使用下面的方式打包,會把之前設定好的資源打成assetbundle。這邊我是把打包出來的資源放到了assets統計目錄的build my assetbundle路徑下,也可以自己指定其他路徑。me...

ORACLE 系統了解之一

返回當前使用者的名字 select user from dual 返回當前使用者環境的資訊userevn 引數 entryid,sessionid,terminal,isdba,lable,language,client info,lang,vsize select userenv isdba fr...