先簡單說下shader的熱更新測試
咱們在項目中使用shader,常見的,兩種方式:優化
第一種是,給render附上一個材質,材質用某一個shader,這種狀況,使用assetbundle熱更新便可。ui
第二種是,runtime須要動態設置的shader,常使用Shader.Find()的方法來獲取。這種方式,只有將shader放到Resources下,才能讀取。可是Resources下的資源,是沒法熱更新的。spa
爲了shader的熱更,咱們就不能用Shader.Find,而是要本身去實現一個相似的調用方式。以下:code
咱們能夠這樣使用遊戲
|
在使用以前,咱們把須要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變種 但願這篇簡單的說明,能給你們帶來幫助。