【1 Shader代码片段】
Shader里有代码片段,可以用关键字(Keyword 也叫Varient)去做分支变化
步骤
(1) 定义
#pragma multi_compile v1 v2
#pragma shader_feature stuff
区别是multi_compile 可以有多个选择在runtime进行选择
而shader_feature 只有一个选择,如果没有使用的话,不会被打包
(2) 使用
#if v1
...
#endif
或者
#if defined(v1)
...
#endif
(3) 选择分支
mat.EnableKeyword ("v1");
mat.DisableKeyword ("v1");
mat.shaderKeywords
进而可以自定义继承MaterialInpector进行设置。
【2 加载优化】
由上可以看出,Shader代码例如Standard Shader,完全编译的话,会有上千个小的GPU Program,导致的问题
1 增加游戏打包时间 和 包体大小
2 游戏帧率低 吃内存
(1) 剔除
用#pragma shader_feature剔除
在Project Settings-> graphics 去掉不需要的与 lightmap/ fog 有关的shader
Shader Build time stripping
(2) Shader Variant Collections
1 在Project窗口直接右键创建Shader Variant Collection
Inspector添加所需要的shader.
选择关键字创建Varient
2 加载
2.1
在Project Settings-> graphics
选择Always Included Shaders
选择Shader preloading ,指定Shader Variant Collection
2.2
在代码里手动
public ShaderVariantCollection svc;
svc.WarmUp ();
总结
通过调用ShaderVariantCollection.WarmUp() 或者 Shader.WarmupAllShaders ();避免物体第一次实例化时
加载Variant所造成的卡顿。
ShaderVariantCollection.WarmUp() 对比Shader.WarmupAllShaders ()的好处是可以分批加载,打散时间。
参考
https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html
http://www.martinpalko.com/muli-compile-unity/
Documentation/en/Manual/OptimizingShaderLoadTime.html
Documentation/en/Manual/class-Shader.html
转载自风宇冲新浪博客