2016-08-04 9 views
4

In Metal was ist der Unterschied zwischen einer packed_float4 und einer float4?Unterschied zwischen gepackten vs normalen Datentyp

+0

https://developer.apple.com/library/ios/documentation/Metal/Reference/MetalShadingLanguageGuide/data-types/data-types.html – FredericP

+1

Ich habe diese Dokumentation gelesen. Sie erfahren nicht, was ein gepackter Datentyp ist. Es offenbart einfach, dass sie in Metall verfügbar sind. – gloo

Antwort

10

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 float416 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 A32 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.

+1

Diese Antwort ist besser als die angenommene Antwort. – warrenm

+0

Es ist wirklich, es hat mir viel beigebracht. –

+0

Es ist in der Tat die richtige Antwort. –

-1

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 
+1

Dies ist keine richtige Antwort. Der Hauptunterschied liegt in der Größe und der Ausrichtung im Speicher. –

+0

@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

+0

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. –

Verwandte Themen