Shader笔记:性能优化注意事项
代码层面
1. 通过代数的方法尽量的减少运算
例如可通过在编写代码前先将一些可以计算掉项项先计算掉。
将
p = sqrt(2 * (x + 1));
修改为:
p = 1.414 * sqrt(x + 1)
2. 尽量使用内建函数。
这些函数大部分是硬件实现的,开发时可以直接利用,可降低代码复杂度,优化计算速度。基本上高代里常用的函数运算都是有的。
https://blog.csdn.net/hgl868/article/details/7876257
3. 如非必要,尽量少将一些运算封装为函数
这样能大大减少GPU函数调用与返回的消耗(目前这是GPU的弱项)
4. 用数学表达式代替分支语句
由于GPU与CPU在硬件结构上有较大差异,执行分支语句的效率非常低,因此往往需要想办法通过内建函数计算出因子,用数学表达式代替分支操作。
例如 将
void main() {
vec2 uv = gl_FragCoord.xy/iResolution.xy;
vec2 origin = vec2(0.5);
if (distance(uv, origin) < 0.5) {
gl_FragColor = vec4(0.0,1.0,1.0,1.0);
} else {
gl_FragColor = vec4(1.0,1.0,1.0,1.0);
}
}
可改为
void main() {
vec2 uv = gl_FragCoord.xy/iResolution.xy;
vec2 origin = vec2(0.5);
float dist = distance(uv, origin);
float a = step(dist, 0.5);
gl_FragColor = a * vec4(0.0,1.0,1.0,1.0) + (1.0 - a) * vec4(1.0,1.0,1.0,1.0);
}
5. 浮点型精度的选择
glsl 中 浮点型精度被分为 lowp,mediump, highp 三种。
通常highp 被用来描述
一般来说 顶点的位置会选用highp, texture coordinate 选用mediump,colors 选用lowp。
选用的时候注意,再效果满足需求的情况下能省则省。
6. 慎用一些高级的内建函数
https://zhuanlan.zhihu.com/p/34629262
知乎上有这样一张表,可以大致对比下各个函数的耗时。
大致就是反三角函数非常费;三角函数在旧硬件上成本较高,据说在现代GPU中,sin与cos的实现采用内置查表法,速度加快不少。不确定硬件情况尽可能少用。
参考资料
【1】https://blog.csdn.net/qq_35312463/article/details/108438410
【2】glsl内建函数
https://blog.csdn.net/hgl868/article/details/7876257
【3】数据精度https://blog.csdn.net/lzt20007/article/details/8731192
【4】慎用一些内建函数。
https://zhuanlan.zhihu.com/p/34629262