Swift 压缩数据类型与正常数据类型之间的差异

Swift 压缩数据类型与正常数据类型之间的差异,swift,types,metal,Swift,Types,Metal,在金属中,packed_float4和float4之间有什么区别 此信息来自 float4具有16个字节的对齐方式。这意味着这种类型的内存地址(例如,0x12345670)可以被16整除(即最后一个十六进制数字是0) 另一方面,packed\u float4具有4字节的对齐方式。地址的最后一位数字将是0、4、8或c 这在创建自定义结构时很重要。假设您想要一个包含2个普通浮点和1个压缩浮点的结构: struct A{ float x, y; float4 z; } struct

在金属中,
packed_float4
float4
之间有什么区别

此信息来自

float4
具有
16个字节的对齐方式。这意味着这种类型的内存地址(例如,
0x12345670
)可以被
16
整除(即最后一个十六进制数字是
0

另一方面,
packed\u float4
具有
4字节的对齐方式。地址的最后一位数字将是
0
4
8
c

这在创建自定义结构时很重要。假设您想要一个包含2个普通浮点和1个压缩浮点的结构:

struct A{
    float x, y;
    float4 z;
}

struct B{
    float x, y;
    packed_float4 z;
}
对于
A
float4
的对齐必须是
16
,并且由于
float4
必须在正常的
float
s之后,因此
y
z
之间将有
8个字节的空格。以下是
A
在内存中的外观:

 Address | 0x200 | 0x204 | 0x208 | 0x20c | 0x210 | 0x214 | 0x218 | 0x21c |
 Content |   x   |   y   |   -   |   -   |   z1  |   z2  |   z3  |   z4  |
                                             ^Has to be 16 byte aligned
对于
B
:压缩浮点数4
的对齐方式为
4
,与
浮点数
相同,因此在任何情况下都可以紧跟在
浮点数
之后:

 Address | 0x200 | 0x204 | 0x208 | 0x20c | 0x210 | 0x214 |
 Content |   x   |   y   |   z1  |   z2  |   z3  |   z4  |
如您所见,
A
占用
32
字节,而
B
仅使用
24
字节。当您拥有这些结构的数组时,
A
将为每个元素占用
8
更多字节。因此,要传递大量数据,最好使用后者

之所以需要
float4
是因为GPU无法处理
4
字节对齐的
packed_float4
s,您将无法在着色器中返回
packed_float4
。这是因为我假设的性能

最后一件事:当您声明结构的Swift版本时:

struct S {
    let x, y: Float
    let z : (Float, Float, Float, Float)
}
该结构在金属中等于
B
,而不是
A
。元组就像一个压缩的浮点数


所有这些也适用于其他向量类型,如
packed_float3
packed_short2
,等等。

我已经阅读了该文档。它不会告诉您什么是压缩数据类型。它只是揭示了它们有金属的形式。