1.Shader变体shader是在GPU中操作的程序,但是使用GPU的工作模式动态分支(if else )的开销很大,静态分支) #if #else。 静态分支在编译时执行。 生成了新的代码段。
shader_feature和multi_compile的相同和不同
#pragma shader_feature是#pragma multi_compile的子集,#pragma shader_feature将生成两个变体。 一个不包含keyword,两个包含keyword 3360 enable _ # pragma multi _ compile也可以获得相同的效果。 但是,只有下降线的keyword必须表示不包含keyword。 在接下来的两行中,两种备选方案效果相似
# pragma shader _ feature enable _ gray # pragma multi _ compile _ enable _ grayui的shader中常见此代码。 __表示不含keyword的备选方案
# pragma multi _ compile _ unity _ ui _ alphaclipmulti _ compile生成所有变体,而shader_feature仅生成材质中使用的变体
以下代码取决于材质中使用了多少组合
# pragma shader _ feature _ enable _ FX # pragma shader _ feature _ FX _ mask _ r _ FX _ mask _ g _ FX _ mask _ b以下的
# pragma multi _ compile _ FX _ enable _ FX # pragma multi _ compile _ FX _ mask _ FX _ mask _ g _ FX _ mask _ mask 我们都要控制shader变体的数量。
在android手机上,第一次使用该变体时,请输入手机目录 phoneAndroiddatacom.baa oo.sgyxcacheunityshadercache
2 .为什么要加热
Shader.WarmupAllShaders用于预热内存中的所有着色器。 不推荐。
ShaderVariantCollection.WarmUp (; (推荐)
调用WarmUp将生成这些文件,以便在以后使用shader时减少CPU开销。
在Unity Profiler下查看这些变体的生成。 如下图所示
第一次启动时,可以看到开销很大,为20.37ms
之后,如果不在内存中,则需要加载此shader时也会显示Shader.CreateGPUProgram,但开销很小,为:2.11ms。 (请参阅
典型的shader可以缓存以避免Shader.Parse和Shader.CreateGPUProgram的性能开销。
Shader.Parse和Shader.CreateGpuProgram分别在做什么事呢?
在加载Shader时会分析Shader.Parse。 (加载时执行)
Shader.CreateGpuProgram是将Shader传递给GPU的提交,GPU驱动程序对其进行编译以适应特定的设备或平台。 在第一次渲染时执行。 (active==false,不在照相机的视锥外等执行。