为啥shader中如果有使用变量的if或for会变慢?
全局变量的问题不熟悉。分支的问题,是由GPU的设计特性决定的。GPU是一个控制器带一窝运算器执行同样的程序。当遇到分支的时候,把false的运算器关了,带着true的运算器跑一通,然后再把true的关了,打开false的,把另外一个分支跑一通。所以,除非你能保证一窝的运算器有同样的分支,那就得各跑一次,自然就慢了。这也是为什么GPU的纸面运算力非常非常高,实际用的时候很难发挥出来。
■网友
……改成uniform后,这被认为是一个由外部传入的可变参数,因此不会进行优化。不加uniform它只是一个常量,你代码里与它相关的计算都会在编译期间合并,for循环也不复存在,当然快了。
GPU的分支运算逻辑并没有缺陷,它只是在“某些时候”需要无视条件跑完所有的分支(解释起来比较麻烦先不说了),会有一定的性能浪费。但是条件只涉及uniform参数的时候并不会跑多余分支,而假如条件涉及到纹理采样,顶点数据时,使用if是最优解。虽然是有浪费,但也没有更好的办法。
总之,把if转换成step,绝不可能变快。
我知道这是一个老问题,其实我是从这篇文章过来的
shader中uniform变量的if或for判断会降低帧率 - xiaxl - CSDN博客
我其实满赞同有测试精神的人的,但你也得会分析结果啊。这个作者之所以觉得if有性能问题,是因为他忽略了7个if (aa == 1.0) 条件判断本身的性能消耗,经过编译器优化后,条件判断之外的代码也就一句四元数赋值而已,最后的结果也就慢了一倍,这恰恰说明,if的性能是没有问题的。
■网友
gpu由很多个 运算kernel 构成 bluramount 声明局部变量 则每个kernel 一份 用uniform 则共享这个变量 共享存储 和局部存储 访问速度可能不同吧
其二 gpu 存储不能给所有kernerl 一次性分配 存储资源 供使用 就导致 需要多批次 也可能会 降低速度
以上只是我猜测 具体细节 不知
■网友
【为啥shader中如果有使用变量的if或for会变慢?】 GPU不熟悉。
推荐阅读
- 如果你的多肉出现这个长势,要注意这个细节,多肉才会越来越美!
- 为啥看到书柜上的藏书会有心旷神怡的感觉
- 为啥知乎上普便有一种【我在北上广深打工,所以拥有更好的视野】这样的错觉
- 为啥工商银行的用户体验如此之差
- 汽车|看了中消协4S店服务测评调查结果,终于知道法系车为啥卖不好了
- 有啥方法,网站,项目可以自己练习计算广告学
- 你为啥从窝窝商城离职?
- 为啥5G和2.4G默认的BSSID是相同的
- 为啥电器实体店的价格比淘宝贵那么多
- 现在在线学习视频有很多了,为啥大部分人还是喜欢下载下来观看
