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
,等等。我已经阅读了该文档。它不会告诉您什么是压缩数据类型。它只是揭示了它们有金属的形式。