假设我在.metal
文件中有以下结构:
struct VertexOut{
float4 position [[position]];
float2 a;
float2 b;
};
此结构是我的片段着色器的[[ stage-in ]]
输入。现在我的一些着色器使用b
而有些则没有。这是否会伤害性能,这意味着我是否应该为不需要它的着色器创建另一个没有b
的结构?
答案 0 :(得分:0)
答案取决于您的使用情况。将会有内存带宽性能下降,但它会相当小。 如果您使用此着色器输出全屏像素并且带宽有限,则删除不需要的float2 可能帮助。
但是,在更改着色器时通常会出现性能损失,因此您可能无需更改片段着色器就可以获得性能优势,这很可能超过任何损失。
我要提出的一个建议是,将a和b更改为float4 a_b
并使用a_b.xy
和a_b.zw
进行访问。寄存器对齐到16个字节,因此这将节省空间。举个例子:
struct X
{
float4 position;
float2 a;
float2 b;
};
struct Y
{
float4 position;
float2 a;
};
struct Z
{
float4 position;
float4 a_b;
};
在上述情况下,X将使用48个字节(每个寄存器有3个16字节的寄存器),而Y或Z只有32个字节(有2个寄存器)。所以使用Z可能会给你两全其美。