shader中性能优化
1.优先用lerp
替代简单if分支
// 低效的if
if (t > 0.5) color = a; else color = b;
// 高效的lerp
color = lerp(b, a, step(0.5, t));
性能对比
-
lerp
通常更快:因为它是纯数学运算(如a * (1 - t) + b * t
),无分支开销,适合并行计算。 -
if
可能更慢:尤其在分支条件动态变化且线程间不一致时(如像素Shader中每个像素的条件不同)。
2.条件分支的类型
• 静态统一分支(Statically Uniform Branching) :如果条件是基于常量或统一变量(uniform)的,并且编译器可以确定所有线程(thread)都会执行相同的分支,则不会导致分支发散(divergence),性能影响较小。例如,如果条件是 _waterEnabled > 0.5,且 _waterEnabled 是一个统一变量,且所有线程的 _waterEnabled 值相同,那么不会产生分支发散。
• 动态分支(Dynamic Branching) :如果条件中包含非统一变量(如每个线程的局部变量),则可能导致分支发散。当一个 warp(一组同时执行的线程)中的不同线程执行不同的分支时,GPU 需要分别处理这些分支,这会降低并行效率,从而对性能产生较大影响。