[Unity 優化]Shader

Shader變種:

multi_compile:代碼控制關鍵字開關,一定會編譯變種;
shader_feature:一般使用材質控制是否使用,被使用纔會生成變種(打AB的話,Shader要和材質球/ShaderVariantCollection打包到同一個AB裏的時候才能知道需要哪些shader_feature);
skip_variants:可以剪裁變種;
Graphics設置裏面設置Always Inclueded Shaders,則所有變種一定都會被打包;
變種太多會導致ShaderLab內存佔用變大,Shader.Parse(編譯Shader)和Shader.CreateGpuProgram(創建CPU執行程序片段)佔用CPU時間變長;

ShaderVariantCollection使用:

使用ShaderVariantCollection來WarmUp,而不是全部WarmUp,是爲了優化Shader.CreateGpuProgram(創建CPU執行程序片段);
使用ClearCurrentShaderVariantCollection和SaveCurrentShaderVariantCollection來計算生成多個ShaderVariantCollection,多幀進行WarmUp;

Shader打包AB:

把所有Shader和ShaderVariantCollection一起打包到一個AB,遊戲運行時加載這個AB全部資源並緩存,並調用其中所有ShaderVariantCollection.WarmUp;
按以上方法打包,理論上之後運行遊戲,不會再有Shader.Parse和Shader.CreateGpuProgram;
如果還出現了Shader.Parse這說明Shader存在冗餘;
如果還出現了Shader.CreateGpuProgram這說明Shader存在冗餘或者ShaderVariantCollection收集不完全;

Shader冗餘:

按以上Shader打包AB的方式進行打包,如果還存在Shader冗餘,則可能是:
Resource目錄下存在Shader並在運行時被使用了,常見第三方插件;
Unity默認材質引用的Shader,又沒有添加到Always Inclueded Shaders;

ShaderLab內存佔用:

ShaderLab內存佔用較大,則可能是:
Shader冗餘,可在Profiler界面Assets/Shader看到同一個Shader出現多個;
變種特別多的Shader使用不當,甚至把這種Shader加到了Always Inclueded Shaders,常見如FBX的默認材質使用Standard;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章