系統所做的事情:
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...