unity的UNITY_BRANCH和UNITY_FLATTEN宏

本文解析了MSDN文档,介绍了HLSL里的UNITY_BRANCH和UNITY_FLATTEN宏。UNITY_BRANCH适合分支代码计算量大的情况,UNITY_FLATTEN适合代码计算量小的情况。若不标记,编译器会自行选择,但开发中最好手动指定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MSDN文档解析:https://docs.microsoft.com/zh-cn/windows/win32/direct3dhlsl/dx-graphics-hlsl-if

UNITY_BRANCH:GPU会先执行if表达式里的条件,若条件返回true,则后续仅执行true对应的那一段代码。但会打乱执行顺序,不适合并行处理。

UNITY_FLATTEN:GPU会执行所有分支的代码,在后面才通过if表达式里的条件来选取其中一个分支的结果。更适合于并行处理。

这两个宏只在HLSL里生效。

如果什么都不标记的话编译器会按自己的判断选择其中之一,然而不是每个平台每个版本的编译器都足够聪明,开发中最好可以进行手动指定。

如何选择:

大多数时候,您都希望进行分支,但是对于特别便宜的计算,分支本身可能比仅做这两种分支都要昂贵。在现代的AMD“ GCN” GPU(过去6年中的任何一种)上,动态分支本身要花费6条指令,因此,if语句可能要比在两个分支内的代码花费更高!现代着色器编译器非常了解要使用哪个选项,并且OpenGL甚至没有办法将一个选项强加​​于另一个,并且假定它会为您做出正确的选择(基本上总是分支),并且如果您想将其展平,请自己将其展平。一般来说,你不需要使用UNITY_BRANCH。

当分支代码计算量大的时候(多于六个指令)用UNITY_BRANCH会比较合适。若代码计算量都不大(少于六个指令),则用UNITY_FLATTEN会比较合适。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值