Unity_Shader之读取时间优化

【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

 

转载自风宇冲新浪博客

你可能感兴趣的:(Unity)