Les types XMVECTOR et XMMATRIX sont les chevaux de travail de la bibliothèque DirectXMath. Chaque opération consomme ou produit des données de ce type. Travailler avec eux est la clé de l'utilisation de la bibliothèque. Toutefois, étant donné que DirectXMath utilise les jeux d'instructions SIMD, ces types de données sont soumis à un certain nombre de restrictions. Il est essentiel que vous compreniez ces restrictions si vous souhaitez utiliser les fonctions DirectXMath.
Vous devriez considérer XMVECTOR comme un proxy pour un registre matériel SIMD, et XMMATRIX comme un proxy pour un regroupement logique de quatre registres matériels SIMD. Ces types sont annotés pour indiquer qu'ils nécessitent un alignement de 16 octets pour fonctionner correctement. Le compilateur les place automatiquement sur la pile lorsqu'ils sont utilisés en tant que variable locale ou les place dans le segment de données lorsqu'ils sont utilisés en tant que variables globales. Avec les conventions appropriées, ils peuvent également être transmis en toute sécurité en tant que paramètres à une fonction (voir Conventions d'appel pour plus de détails).
Les allocations du tas, cependant, sont plus compliquées. En tant que tel, vous devez être prudent lorsque vous utilisez XMVECTOR ou XMMATRIX en tant que membre d'une classe ou d'une structure à attribuer à partir du tas. Sous Windows x64, toutes les allocations de segment sont alignées sur 16 octets, mais pour Windows x86, elles ne sont alignées que sur 8 octets. Il existe des options pour allouer des structures à partir du tas avec un alignement de 16 octets (voir Aligner correctement les allocations). Pour les programmes C++, vous pouvez utiliser les surcharges de l'opérateur new/delete/new []/delete [] (globales ou propres à la classe) pour appliquer un alignement optimal si vous le souhaitez.
Remarque Au lieu d'appliquer directement l'alignement dans votre classe C++ en surchargeant new/delete, vous pouvez utiliser l'idiome pImpl. Si vous vous assurez que votre classe Impl est alignée via __aligned_malloc en interne, vous pouvez utiliser librement les types alignés dans l'implémentation interne. C'est une bonne option lorsque la classe 'public' est une classe de référence Windows Runtime ou est destinée à être utilisée avec std :: shared_ptr <>, ce qui peut perturber l'alignement.
Cependant, il est souvent plus facile et plus compact d'éviter d'utiliser XMVECTOR ou XMMATRIX directement dans une classe ou une structure. Au lieu de cela, utilisez XMFLOAT3, XMFLOAT4, XMFLOAT4X3, XMFLOAT4X4, et ainsi de suite, en tant que membres de votre structure. En outre, vous pouvez utiliser les fonctions de chargement de vecteur et de stockage de vecteur pour déplacer efficacement les données dans des variables locales XMVECTOR ou XMMATRIX, effectuer des calculs et stocker les résultats.Il existe également des fonctions de diffusion en continu (XMVector3TransformStream, XMVector4TransformStream, etc.) qui fonctionnent efficacement directement sur les tableaux de ces types de données.
Gardez à l'esprit que DirectX n'a rien à voir avec notamment DirectXMath. DirectXMath peut fonctionner aussi bien avec n'importe quelle version de Direct3D ou même OpenGL car il ne fait que des calculs vectoriels et matriciels côté CPU. DirectXMath ne dépend pas vraiment du système d'exploitation Windows du tout; c'est juste une collection de code C/C++ utilisant des intrinsèques donc le compilateur est tout ce qui compte vraiment. En fait, étant donné que vous êtes apparemment assez novice pour DirectX pour ne pas savoir comment utiliser DirectXMath, vous devriez envisager d'utiliser DirectX 11 et ne pas essayer de sauter directement dans DirectX 12. DirectX 12 est une API très impitoyable conçue pour les experts graphiques, et suppose en grande partie que vous êtes déjà un expert dans la programmation Direct3D 11.
Merci. J'apprécie vraiment pour votre réponse. – Funastic