Freigeben über


Codemigration aus der XNA Math Library

In dieser Übersicht werden die Änderungen beschrieben, die zum Migrieren vorhandener Code mithilfe der XNA-Mathematikbibliothek zur DirectXMath-Bibliothek erforderlich sind.

Kopfzeilenänderungen

Die DirectXMath-Bibliothek verwendet einen neuen Satz von Headern.

Ersetzen Sie den xnamath.h Header durch DirectXMath.h, und fügen Sie DirectXPackedVector.h für die GPU-gepackten Typen hinzu.

Die Begrenzungstypen aus dem DirectX SDK Collision-Beispiel in xnacollision.h sind jetzt Teil der DirectXMath-Bibliothek in DirectXCollision.h. Diese wurden geändert, um C++-Klassen anstelle einer C-Stil-API zu verwenden.

Konstantenänderungen

XNAMATH_VERSION (200, 201, 202, 203, 204 usw.) wurde durch DIRECXTMATH_VERSION (300, 301, 302, 303 usw.) ersetzt.

Anmerkung

DirectXMath 3.00 und 3.02 wurden mit vorläufigen Versionen des Windows SDK ausgeliefert. DirectXMath 3.03 ist in der endgültigen Version des Windows 8 SDK enthalten.

Namespaces

Die DirectXMath-Bibliothek verwendet C++-Namespaces, um die Typen zu organisieren. XNA Math hat nur den globalen Namespace verwendet. Die DirectXMath-Typen, die mit XNA Math gemeinsam sind, befinden sich im DirectX- oder im DirectX::P ackedVector Namespace.

In C++-Quelldateien besteht eine einfache Lösung darin, using Anweisungen hinzuzufügen.

#include "DirectXMath.h"
#include "DirectXPackedVector.h"

using namespace DirectX; 
using namespace DirectX::PackedVector;

Bei Kopfzeilen wird es nicht als bewährte Methode angesehen, using-Anweisungen hinzuzufügen. Fügen Sie stattdessen vollqualifizierte Namespaces hinzu.

struct mystruct
{
   DirectX::XMFLOAT3 position;
   DirectX::PackedVector::HALF packedValue;
};

Teillasten

Bei verschiedenen Funktionen, die weniger als 4 Elemente eines XMVECTOR laden, verließ die XNA Math-Bibliothek die zusätzlichen Elemente undefiniert. DirectXMath füllt diese zusätzlichen Elemente immer mit 0.

Entfernen bestimmter Xbox 360-Typen

Die folgenden XNA Math-Bibliothekstypen, -Funktionen und -Konstanten sind in DirectXMath nicht verfügbar.

  • HENDN3, XMHEND3, XMUHENDN3, XMUHEND3, XMDHENN3, XMDHEN3, XMUDHENN3, XMUDHEN3
  • XMLoadHenDN3(), XMLoadHenD3(), XMLoadUHenDN3(), XMLoadUHenD3(), XMLoadDHenN3(), XMLoadDHen3(), XMLoadUDHenN3(), XMLoadUDHen3()
  • XMStoreHenDN3(), XMStoreHenD3(), XMStoreUHenDN3(), XMStoreUHenD3(), XMStoreDHenN3(), XMStoreDHen3(), XMStoreUDHenN3(), XMStoreUDHen3()
  • g_XMMaskHenD3, g_XMMaskDHen3, g_XMAddUHenD3, g_XMAddHenD3, g_XMAddDHen, g_XMMulHenD3, g_XMMulDHen3, g_XMXorHenD3, g_XMXorDHen3
  • XMXICON4, XMXICO4, XMICON4, XMICO4, XMUICON4, XMUICO4
  • XMLoadXIcoN4(), XMLoadXIco4(), XMLoadIcoN4(), XMLoadIco4(), XMLoadUIcoN4(), XMLoadUIco4()
  • XMStoreXIcoN4(), XMStoreXIco4() ,XMStoreIcoN4(), XMStoreIco4(), XMStoreUIcoN4(), XMStoreUIco4()
  • g_XMMaskIco4, g_XMXorXIco4, g_XMXorIco4, g_XMAddXIco4, g_XMAddUIco4, g_XMAddIco4, g_XMMulIco4

__vector4i ist veraltet. Verwenden Sie stattdessen XMVECTORI32 oder XMVECTORU32.

Die folgenden Funktionen und Typen sind veraltet, da sie nur Xbox 360 sind: XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDEC4, XMLoadXDec4, XMStoreXDec4, XMXDEC4.

systeminterne ARM-NEON

Das Deklarieren einer Vektorkonstante mit diesem Code wird für XNA Math für SSE und NO-SYSTEMINTERNS kompiliert, schlägt jedoch für DirectXMath mit ARM-NEON fehl.

XMVECTOR v = { 1.f, 2.f, 3.f, 4.f }

Im Allgemeinen wird diese Methode der Initialisierung eines XMVECTOR-nicht empfohlen. Wenn Sie jedoch eine Vektorkonstante benötigen, unterstützt die XMVECTORF32 Klasse diese Art der Initialisierung und gibt den XMVECTOR- Typ automatisch zurück, damit Sie XMVECTORF32 in den meisten kontexten verwenden können. Alle Schreibvorgänge in eine XMVECTORF32 Klasse erfordern expliziten Verweis auf die V-XMVECTOR Member.

Vertauschen

Die XNA Mathe-Bibliothek hatte das folgende Format für die allgemeine Vektor-Permute:

XMVECTOR XMVectorPermuteControl(UINT ElementIndex0, UINT ElementIndex1, UINT ElementIndex2, UINT ElementIndex3);
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Control);

Für DirectXMath wurde XMVectorPermuteControl- eliminiert und die XM_PERMUTE_0X .. XM_PERMUTE_1Z Konstanten wurden neu definiert, um einfache 0-7-Indizes zu sein. Hier ist die neue Signatur für XMVectorPermute:

XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW);

Anstelle eines Steuerelementworts verwendet diese Funktion direkt die 4 Indizes als Parameter, was es auch analog zur XMVectorSwizzle--Funktion unter Verwendung der neuen XM_SWIZZLE_X .. XM_SWIZZLE_W Konstanten, die als einfache 0-3-Indizes definiert sind.

XMVECTOR XMVectorSwizzle(FXMVECTOR V, uint32_t E0, uint32_t E1, uint32_t E2, uint32_t E3);

Anmerkung

Bei konstanten Werten gibt es eine viel effizientere Möglichkeit, die Stummschaltung zu implementieren. Verwenden Sie anstelle der Funktionsform XMVectorPermute-die Vorlage Formular:

template<uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW>
    XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2)</code></pre></td>

Vorlagenformulare

Im Allgemeinen ist die Verwendung eines Vorlagenformulars über eine Funktionsform der folgenden Funktionen wesentlich effizienter und ermöglicht es der Bibliothek, plattformspezifische Optimierungen durch Vorlagenspezialisierung auszuführen.

template<uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW>
    XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2)

template<uint32_t SwizzleX, uint32_t SwizzleY, uint32_t SwizzleZ, uint32_t SwizzleW>
    XMVECTOR XMVectorSwizzle(FXMVECTOR V)

template<uint32_t Elements>
    XMVECTOR XMVectorShiftLeft(FXMVECTOR V1, FXMVECTOR V2)

template<uint32_t Elements>
    XMVECTOR XMVectorRotateLeft(FXMVECTOR V)

template<uint32_t Elements>
    XMVECTOR XMVectorRotateRight(FXMVECTOR V)

template<uint32_t VSLeftRotateElements, uint32_t Select0, uint32_t Select1, uint32_t Select2, uint32_t Select3>
    XMVECTOR XMVectorInsert(FXMVECTOR VD, FXMVECTOR VS)</code></pre></td>

Entfernte Funktionen

Eliminierte Funktion Ersatz
XMStoreFloat3x3NC XMStoreFloat3x3-
XMStoreFloat4NC XMStoreFloat4-
XMStoreFloat4x3NC XMStoreFloat4x3-
XMStoreFloat4x4NC XMStoreFloat4x4-
XMStoreInt4NC XMStoreInt4-
XMVector2InBoundsR XMVector2InBounds ? XM_CRMASK_CR6BOUNDS : 0
XMVector2TransformStreamNC XMVector2TransformStream-
XMVector3InBoundsR XMVector3InBounds ? XM_CRMASK_CR6BOUNDS : 0
XMVector3TransformStreamNC XMVector3TransformStream-
XMVector4InBoundsR XMVector4InBounds ? XM_CRMASK_CR6BOUNDS : 0
XMVectorCosHEst XMVectorCosH-
XMVectorExpEst XMVectorExp
XMVectorLogEst XMVectorLog-
XMVectorPowEst XMVectorPow
XMVectorSinHEst XMVectorSinH-
XMVectorTanHEst XMVectorTanH-

DirectXMath-Programmierhandbuch