1.预热Shader
1.预热Shader
a.Shader编译就是把人类可读的Shader代码, 翻译成特定GPU能直接执行的机器指令的过程
b.预热Shader就是在使用Shader前提前进行编译
当游戏运行时, 一个物体第一次需要使用某个Shader的特定变体时, 真正的"翻译"才开始; Unity的图形引擎(CPU端)会结合
当前的渲染状态(如灯光开启、雾效开启、是否蒙皮等), 从中间代码中选出需要的部分; 然后, 调用对应平台(如Android的
OpenGL ES、Windows的Direct3D、iOS的Metal)的图形驱动程序;
图形驱动程序扮演了"终极翻译官"的角色, 它将中间代码最终翻译成当前设备GPU的专属机器码; 这个翻译过程非常耗时, 会
阻塞游戏的主线程, 导致游戏卡顿
通过Shader Variant Collection(着色器变体集合)进行着色器预编译
a.在Project窗口右键 → Create → Shader → Shader Variant Collection(着色器变体集合)
b.在Inspector窗口中手动添加想要预热的Shader
c.在脚本中获取到Shader Variant Collection 利用其中的API WarmUp()进行预编译
if( svc!= null && !svc.isWarmedUp )
{
svc.WarmUp();
}
注: 预热Shader还是需要在合适的时机进行, 比如加载界面时
ShaderVariantCollection svc = new ShaderVariantCollection();
ShaderVariantCollection.Entry entry = new ShaderVariantCollection.Entry();
entry.shader = Shader.Find("Standard");
entry.passType = PassType.ForwardBase;
entry.keywords = new string[] { "_NORMALMAP" };
svc.Add(entry);