原因說明:
游戲中資源全部打包ab包進行加載。由于對ab包相應(yīng)規(guī)則理解不正確,可能會導(dǎo)致資源重復(fù)被打包蝶溶。下面介紹下我的排查思路。
資源重復(fù)的主要原因 :當ab包打包時,發(fā)現(xiàn)依賴資源不再自己的ab包中或者不再其他ab包中抖所,就會復(fù)制一份資源到自己的ab包中梨州。
其他原因:
- 游戲資源被內(nèi)嵌到包體中了(一般是Resources文件夾中的資源和依賴資源)
- Graphics設(shè)置中添加了額外的shader。(這里的shader的一定會被嵌入到包體內(nèi)田轧,可以使用Shader.Find調(diào)用)暴匠,添加到這里會把所有變體編譯,被坑過
1. 準備工作:
1.1 準備好apk/ipa
下載游戲的apk包(ipa一樣的)傻粘,將后綴改成zip每窖,解壓到文件夾下面。
1.2 下載資源解析工具:
https://www.perfare.net/1194.html
1.3 解析資源
解析解壓的文件抹腿,我們就可以apk中所有的資源了:
資源解析后如下圖:
2. 具體說明
2.1 最多的坑 standard shader (AB包 standard 清理)
解析資源后會發(fā)現(xiàn)有很多重復(fù)的standard shader岛请,但是項目中使用的shader都是我們自己寫的,根本不會使用系統(tǒng)自帶的警绩。最后發(fā)現(xiàn)是模型引入的問題崇败。 當模型Materials設(shè)置如下兩張圖的時候,都會講默認的standard打入到ab包中肩祥。
圖一:
圖二:
解決方案:
- 引入的時候指定具體的材質(zhì)球和shader (建議使用該方案)
- 創(chuàng)建一個我們自己使用的材質(zhì)后室,給引入的模型
- 提取需要使用的資源(如:mesh,動作等)后,刪除fbx
2.2 RawImage組件 或 類似組件的問題
項目使用Packing Tag來組織圖集(如圖一)混狠,RawImage可以直接用原始圖賦值(如圖二)岸霹,但打AB包的時候會復(fù)制一張圖片(如圖三)。
圖一:
圖二:會生成二外的Texture
圖三:生成了額外的Texture
3.其他簡單說明
3.1 使用unity默認shader将饺,導(dǎo)致大量的重復(fù)shader
如下圖:
解決方案:
- 禁止使用系統(tǒng)默認的shader贡避,自己實現(xiàn)相應(yīng)功能的shader,將shader文件放在同一AB包中予弧。
3.2 圖集的結(jié)構(gòu)問題
同一圖集的圖片刮吧,放在不同的AB包結(jié)構(gòu)下,會導(dǎo)致圖集在不同的AB包中都存在掖蛤。對內(nèi)存和包體影響會比較大杀捻。
3.3 其他遇見的問題
- shader的變體問題: 盡量減少變體,使用Shader Variants Collection進行控制蚓庭,使用代碼預(yù)加載Shader Variants Collection致讥。 不要將Shader Variants Collection放到Graphics設(shè)置中,對AB處理沒有作用器赞。對Shader.Find方法有作用垢袱。
- 材質(zhì)球盡量和預(yù)設(shè)放在一個AB包里面。 出現(xiàn)過不放在一起港柜,變體沒有生效的問題请契。
- AB包最好不要超過2M,協(xié)程加載時在一些機器上可能會出現(xiàn)卡頓。
- AB包中的shader要按資源加載的方式處理姚糊,不能使用Shader.Find()贿衍。
- 美術(shù)對sprite怎么生成圖不理解,導(dǎo)致特效制作時容易出問題救恨。
- 圖片壓縮格式不正確贸辈,會導(dǎo)致占用額外的內(nèi)存。建議android盡量使用ETC格式
- 美術(shù)字體問題肠槽,美術(shù)字體使用的Texture擎淤,設(shè)置成sprite導(dǎo)致了在圖集中也會存在。
說明:以上觀點僅是本人自己的觀點秸仙,如有問題請聯(lián)系我嘴拢,我會及時更正。