本文共 1143 字,大约阅读时间需要 3 分钟。
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来WarmUp,而不是全部WarmUp,是为了优化Shader.CreateGpuProgram(创建CPU执行程序片段);
使用ClearCurrentShaderVariantCollection和SaveCurrentShaderVariantCollection来计算生成多个ShaderVariantCollection,多帧进行WarmUp;把所有Shader和ShaderVariantCollection一起打包到一个AB,游戏运行时加载这个AB全部资源并缓存,并调用其中所有ShaderVariantCollection.WarmUp;
按以上方法打包,理论上之后运行游戏,不会再有Shader.Parse和Shader.CreateGpuProgram; 如果还出现了Shader.Parse这说明Shader存在冗余; 如果还出现了Shader.CreateGpuProgram这说明Shader存在冗余或者ShaderVariantCollection收集不完全;按以上Shader打包AB的方式进行打包,如果还存在Shader冗余,则可能是:
Resource目录下存在Shader并在运行时被使用了,常见第三方插件; Unity默认材质引用的Shader,又没有添加到Always Inclueded Shaders;ShaderLab内存占用较大,则可能是:
Shader冗余,可在Profiler界面Assets/Shader看到同一个Shader出现多个; 变种特别多的Shader使用不当,甚至把这种Shader加到了Always Inclueded Shaders,常见如FBX的默认材质使用Standard;转载地址:http://wxyrz.baihongyu.com/