Unity ShaderLab內存優化

先簡單說下shader的熱更新測試

咱們在項目中使用shader,常見的,兩種方式:優化

第一種是,給render附上一個材質,材質用某一個shader,這種狀況,使用assetbundle熱更新便可。ui

第二種是,runtime須要動態設置的shader,常使用Shader.Find()的方法來獲取。這種方式,只有將shader放到Resources下,才能讀取。可是Resources下的資源,是沒法熱更新的。spa

爲了shader的熱更,咱們就不能用Shader.Find,而是要本身去實現一個相似的調用方式。以下:code

咱們能夠這樣使用遊戲

 

Shader targetShader = ShaderBinder.me.getShader(targetShaderName);內存

在使用以前,咱們把須要get的shader,拖到對應的腳本上。讓後將對應的prefab打包成assetbundle,在遊戲開始前load出來。ci

shaderlab的內存優化資源

shaderlab的內存問題,第一個就是standard shader。有幾種可能會引入standard shader:get

1,import 模型的時候,自動建立的材質。

即便咱們去掉import materials的勾選,仍是會引入這個材質。想要完全地去掉,須要將默認render的材質清空,或者設置一個本身定義的材質:

設置爲自定義的一個材質

2,美術或者程序,在製做場景,製做資源的時候,錯誤地使用了默認的材質。例如,在場景中建立了一個默認的cube,這個cube,就會使用默認的材質,默認材質用的就是standard shader。

對於遊戲場景,咱們能夠在保存場景的時候,自動替換全部場景中默認的材質。

替換掉默認材質,替換掉standard shader

經過遊戲場景的保存,能大部分解決問題了。

可是,程序可能用到的材質,可能散落在各處。每一個項目理論上都能找出全部真正打包須要的全部prefab,而後用上面的方法統一替換包含standard的材質便可。

經過上面的方法,咱們項目,已經排除了standard shader,在真機測試中,shaderlab的內存,降到了20多M。

經過對standard的剔除,shaderlab降到了20M左右。咱們在看profile的分析的時候,發現這樣一種狀況,在profile中,咱們看到同一個shader,會有多個copy,例以下圖的Diffuse。

在個人項目中,這種狀況,是由於咱們的prefab,或者粒子特效,用的都是unity內置的shader,這些shader,在打包assetbundle的時候,是不會被打包的。致使存在冗餘,

可是,我認爲上面assetbundle零冗餘方案的解決方案不是太好,因此,在研究和測試後,咱們有了本身的方法,去處理依賴unity內置資源的問題。

1, 下載unity的build in shader,導入到項目中(若是項目開始就這麼作了,能省不少事),後續當咱們在材質上選擇shader的時候,用的就不是build in的shader,而是導入到工程的shader,就和咱們其餘shader同樣,能夠更改,能夠熱更,打包也不會冗餘了。

2, 替換默認的材質。美術製做資源的時候,有時候會用默認的材質,除了Default-Material,還有Default-Particle(特效常常用),Sprites-Default。

咱們不可能要求美術注意到不用默認材質,對他們要求過高了,也不科學。因此,咱們須要用腳本作統一更改。咱們就用以前的腳本,對須要打包的資源,作統一替換材質便可

第一個紅框內,是替換默認材質,第二個紅框內,是替換爲導入的shader。

經過這個優化以後,咱們在用profile看的時候,應該解決了90%的重複,還有不多數的重複,我沒有仔細研究是哪裏來的。咱們花20%的精力,解決掉80%的問題,shaderlab已經從20多M,降低到5M,我以爲已經ok了。

這個方法帶來的好處,除了shaderlab內存下降,也使咱們再也不依賴不可編輯的內置shader,讓全部的shader均可改,可更新。

  • 上面的方法,很好地運行了一段時間,可是在幾個月後我再一次profile的時候發現,shaderlab,又漲到28M了,此次即沒有standard,也沒有內置shader冗餘的問題。

在仔細地分析測試後,定位在咱們使用的後處理shader上,咱們使用的後處理是:Unity-Technologies/PostProcessing,根據篩選,咱們只用到其中的bloom 和 Color Grading,只有這兩個,不該該,額外增長了20M多的內存吧。

最後分析,是由於後處理的multi_compile,致使過多的shader變種,而不少變種,是咱們不須要的

很是多的變種

解決方法是,根據需求,註釋掉不須要的變種便可

註釋掉之後(記得註釋對應的shader內對應的#if 這類代碼塊),shaderlab從28M回到了6M多點,這就是一個合理的數據了。

最後,總結下shaderlab的內存優化:

清理standard的使用,不要讓其進入打包內容

處理內置shader和默認材質的問題,替換爲建立的材質和導入的shader,減小冗餘。

清理複雜shader的multi_compile或者shader feature,刪除或註釋不須要的,減小shader變種 但願這篇簡單的說明,能給你們帶來幫助。

相關文章
相關標籤/搜索