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. –
- 1. Datentyp vs UIHint
- 2. Mandrill - Der Unterschied zwischen global_merge_vars und normalen merge_vars
- 3. Was ist der Unterschied zwischen() vs [] vs {}?
- 4. unlocked_ioctl vs normalen ioctl
- 5. Unterschied zwischen session.evict vs. clear
- 6. Unterschied zwischen Object.getPrototypeOf vs __proto__
- 7. Unterschied zwischen Object.create (null) vs {}?
- 8. Unterschied zwischen cr vs _cr
- 9. Unterschied zwischen oracle.sql.BLOB.DURATION_CALL vs oracle.sql.BLOB.DURATION_SESSION
- 10. Unterschied zwischen Freeglut vs Glew?
- 11. Unterschied zwischen NUnit vs NUnit2
- 12. Unterschied zwischen „get‘ VS ‚getProperty‘
- 13. Unterschied zwischen BitmapFactory.decodeFile vs decodeStream
- 14. std :: vector vs normalen Array
- 15. Was ist der Unterschied zwischen vim Regex und normalen Regex?
- 16. Unterschied zwischen OSGi-Bundle und normalen .JAR-Dateien Verwendung
- 17. Unterschied zwischen HTML-Komponente und einer normalen Komponente in Aurelia?
- 18. Unterschied zwischen einer AppCompat-Ansicht und einer normalen Android-Ansicht
- 19. Knockout Unterschied zwischen normalen Javascript-Funktion und eine berechnete
- 20. Datentyp String vs Zeichenfolge in C#
- 21. Unterschied zwischen Grep Vs Katze und Grep
- 22. Unterschied zwischen Linux-Variablen $ BASH_SUBSHELL vs $ SHLVL
- 23. Welcher Unterschied zwischen Jersey vs JAX-RS-
- 24. Android Unterschied zwischen View.getLeft() vs View.getScrollX()
- 25. Unterschied zwischen io.open vs öffnen in Python
- 26. Unterschied zwischen Locale FRENCH vs Locale FRANKREICH
- 27. Unterschied zwischen zufälligen randint vs Randrange
- 28. Unterschied zwischen javax.servlet-api.jar vs Servlet-api.jar
- 29. Unterschied zwischen Vorlagenparameter Typname vs Nicht Typnamen?
- 30. Unterschied zwischen Wildfly 8 vs 10
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