Kódmigrálás az XNA matematikai könyvtárából
Ez az áttekintés a meglévő kód XNA matematikai kódtárból DirectXMath-kódtárba való migrálásához szükséges módosításokat ismerteti.
Fejlécmódosítások
A DirectXMath-kódtár új fejléckészletet használ.
Cserélje le a xnamath.h
fejlécet DirectXMath.h
, és adja hozzá DirectXPackedVector.h
a GPU-val csomagolt típusokhoz.
A xnacollision.h
DirectX SDK ütközési mintájából származó határolótípusok mostantól DirectXCollision.h
DirectXMath könyvtárának részét képezik. Ezeket úgy módosították, hogy C++ osztályokat használjanak, nem pedig C stílusú API-t.
Állandó változások
XNAMATH_VERSION (200, 201, 202, 203, 204 stb.) DIRECXTMATH_VERSION (300, 301, 302, 303 stb.) váltották fel.
Jegyzet
A DirectXMath 3.00 és 3.02 a Windows SDK előzetes verzióival szállítva. A DirectXMath 3.03 a Windows 8 SDK végleges verziójában érhető el.
Névterek
A DirectXMath-kódtár C++ névtereket használ a típusok rendszerezéséhez. Az XNA Math csak a globális névteret használta. Az XNA-matematikával közös DirectXMath-típusok a DirectX vagy a DirectX::P ackedVector névtérben találhatók.
A C++ forrásfájlokban egyszerű megoldás using
utasítások hozzáadása.
#include "DirectXMath.h"
#include "DirectXPackedVector.h"
using namespace DirectX;
using namespace DirectX::PackedVector;
Fejlécek esetében nem ajánlott utasításokkal hozzáadni. Ehelyett adjon hozzá teljesen minősített névtereket.
struct mystruct
{
DirectX::XMFLOAT3 position;
DirectX::PackedVector::HALF packedValue;
};
Részleges terhelések
Az XMVECTOR 4 eleménél kevesebbet töltő különböző függvények esetében az XNA matematikai kódtár nem definiálta a további elemeket. A DirectXMath mindig 0-val tölti ki ezeket a további elemeket.
Az Xbox 360-specifikus típusok eltávolítása
Az alábbi XNA matematikai kódtártípusok, függvények és állandók nem érhetők el a DirectXMath-ban.
- 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 elavult. Használjon inkább XMVECTORI32 vagy XMVECTORU32.
A következő függvények és típusok elavultak, mivel csak Xbox 360-asak: XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDEC4, XMLoadXDec4, XMStoreXDec4, XMStoreXDec4, XMXDEC4.
ARM-NEON belső metrikák
Ha ezzel a kóddal deklarál egy vektorkonstanst, az XNA Math for SSE és a NO-INTRINSICS esetében fordítja le, de az ARM-NEON használatával a DirectXMath esetében sikertelen lesz.
XMVECTOR v = { 1.f, 2.f, 3.f, 4.f }
Általában nem javasoljuk az XMVECTORinicializálásának ezt a metódusát. Ha azonban vektorállandót szeretne, a XMVECTORF32 osztály támogatja ezt az inicializálási stílust, és automatikusan visszaadja a XMVECTOR típust, így a legtöbb környezetben használhatja a XMVECTORF32. Az XMVECTORF32 osztályba történő írási műveletekhez explicit módon kell hivatkozni a .v XMVECTOR tagra.
Permute
Az XNA matematikai kódtára az alábbi űrlapot tartalmazza az általános vektoros permutációhoz:
XMVECTOR XMVectorPermuteControl(UINT ElementIndex0, UINT ElementIndex1, UINT ElementIndex2, UINT ElementIndex3);
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Control);
A DirectXMath esetében XMVectorPermuteControl megszűnt, és a XM_PERMUTE_0X.. XM_PERMUTE_1Z konstansokat újradefiniáltuk egyszerű 0-7 indexekként. Íme az új aláírás XMVectorPermute:
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW);
Vezérlőszavak helyett ez a függvény közvetlenül a 4 indexet veszi paraméterként, ami az új XM_SWIZZLE_X használatával az XMVectorSwizzlefüggvényhez hasonlóvá teszi. XM_SWIZZLE_W egyszerű 0-3 indexként definiált állandók.
XMVECTOR XMVectorSwizzle(FXMVECTOR V, uint32_t E0, uint32_t E1, uint32_t E2, uint32_t E3);
Jegyzet
Az állandó értékek esetében a permutálás implementálásának sokkal hatékonyabb módja van. Az XMVectorPermutefüggvényforma helyett használja a sablon űrlapot:
template<uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW>
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2)</code></pre></td>
Sablonűrlapok
Általánosságban elmondható, hogy a sablonűrlap használata az alábbi függvények függvényformáin sokkal hatékonyabb, és lehetővé teszi a kódtár számára, hogy platformspecifikus optimalizálásokat végezhessenek a sablon specializáción keresztül.
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>
Megszüntetett függvények
Kiesett függvény | Helyettesítés |
---|---|
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 |