金属结构中未使用的属性是否会损害性能

时间:2016-08-17 19:53:04

标签: fragment-shader metal

假设我在.metal文件中有以下结构:

struct VertexOut{
    float4 position [[position]];
    float2 a;
    float2 b;
};

此结构是我的片段着色器的[[ stage-in ]]输入。现在我的一些着色器使用b而有些则没有。这是否会伤害性能,这意味着我是否应该为不需要它的着色器创建另一个没有b的结构?

1 个答案:

答案 0 :(得分:0)

答案取决于您的使用情况。将会有内存带宽性能下降,但它会相当小。 如果您使用此着色器输出全屏像素并且带宽有限,则删除不需要的float2 可能帮助。

但是,在更改着色器时通常会出现性能损失,因此您可能无需更改片段着色器就可以获得性能优势,这很可能超过任何损失。

我要提出的一个建议是,将a和b更改为float4 a_b并使用a_b.xya_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可能会给你两全其美。