In Metal was ist der Unterschied zwischen einer packed_float4
und einer float4
?Unterschied zwischen gepackten vs normalen Datentyp
Antwort
Diese Informationen sind von here
float4
eine Ausrichtung von 16
Bytes hat. Dies bedeutet, dass die Speicheradresse eines derartigen Typs (z. B. 0x12345670
) durch 16
teilbar ist (die letzte hexadezimale Ziffer ist 0
).
packed_float4
auf der anderen Seite hat eine Ausrichtung von 4 bytes
. Die letzte Ziffer der Adresse lautet 0
, 4
, 8
oder c
Dies ist wichtig, wenn Sie benutzerdefinierte Strukturen erstellen. Sagen Sie bitte eine Struktur mit zwei normalen float
s wollen und 1 float4
/packed_float4
:
struct A{
float x, y;
float4 z;
}
struct B{
float x, y;
packed_float4 z;
}
Für A
: Die Ausrichtung der float4
16
sein und da float4
nach den normalen float
s sein muss, wird es gehen 8
Bytes von leerem Raum zwischen y
und z
sein. Hier ist, was A
wie im Speicher aussieht:
Address | 0x200 | 0x204 | 0x208 | 0x20c | 0x210 | 0x214 | 0x218 | 0x21c |
Content | x | y | - | - | z1 | z2 | z3 | z4 |
^Has to be 16 byte aligned
Für B
: Ausrichtung der packed_float4
ist 4
, die gleiche wie float
, so kann es folgen gleich nach dem float
s in jedem Fall:
Address | 0x200 | 0x204 | 0x208 | 0x20c | 0x210 | 0x214 |
Content | x | y | z1 | z2 | z3 | z4 |
Wie Sie sehen können, nimmt A
32
Bytes auf, während B
nur 24
Bytes verwendet. Wenn Sie ein Array dieser Strukturen haben, wird A
weitere 8
Bytes für jedes Element belegen. Um viele Daten zu übertragen, wird letzteres bevorzugt.
Der Grund, warum Sie float4
überhaupt brauchen, ist, weil die GPU nicht 4
Byte packed_float4
s ausgerichtet handhaben können, werden Sie nicht in der Lage sein packed_float4
in einem Shader zurückzukehren. Dies liegt an der Leistung, die ich vermute.
Eine letzte Sache: Wenn Sie die Swift-Version einer Struktur deklarieren:
struct S {
let x, y: Float
let z : (Float, Float, Float, Float)
}
Diese Struktur wird B
in Metall und nichtA
gleich sein. Ein Tupel ist wie ein packed_floatN
.
All dies gilt auch für andere Vektortypen wie packed_float3
, packed_short2
, ect.
Diese Antwort ist besser als die angenommene Antwort. – warrenm
Es ist wirklich, es hat mir viel beigebracht. –
Es ist in der Tat die richtige Antwort. –
Von dem, was ich sammeln von the documentation:
Verpackt Datentypen sind Arrays, während ihre unverpackten Gegenstücke structs sind.
Hier ist ihre Nutzung:
packed_float4 packedFloat4;
packedFloat4[0] = 0.0f;
packedFloat4[1] = 1.0f;
packedFloat4[2] = 2.0f;
packedFloat4[3] = 3.0f;
packed_float4 anotherPackedFloat4 = [0.0f, 1.0f, 2.0f, 3.0f] //array initalizer
//vs.
float4 f;
f.x = 0; //equivalent to f.r = 0;
f.y = 1; //equivalent to f.g = 1;
f.z = 2; //equivalent to f.b = 2;
f.w = 3; //equivalent to f.a = 3;
float4 anotherFloat4 = float4(0.0f, 1.0f, 2.0f, 3.0f) //constructor call
Dies ist keine richtige Antwort. Der Hauptunterschied liegt in der Größe und der Ausrichtung im Speicher. –
@DalijaPrasnikar OP fragte nach dem Unterschied zwischen den beiden, und ich gab eine korrekte Antwort auf ihren Unterschied, wie es den Verbrauchern der API erscheint. Wenn Sie eine Antwort auf weitere Unterschiede machen, werde ich sie gerne aufwerten. – Alexander
Sie gaben eine halbe Antwort. Struct vs Array ist ein Nebeneffekt des wahren Grundes, warum diese beiden Typen existieren und unterscheiden sich in Funktionalität und Nutzung. –
https://developer.apple.com/library/ios/documentation/Metal/Reference/MetalShadingLanguageGuide/data-types/data-types.html – FredericP
Ich habe diese Dokumentation gelesen. Sie erfahren nicht, was ein gepackter Datentyp ist. Es offenbart einfach, dass sie in Metall verfügbar sind. – gloo