2017-07-09 6 views

Répondre

1

Ceci est couvert dans le Guide du programmeur DirectXMath sur MSDN que vous devriez prendre le temps de lire. En particulier, lisez la section Mise en route intitulée Type Usage Guidelines.

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.

Cette exigence d'alignement strict et la verbosité est par la conception comme il est clairement indiqué au programmateur lorsque les frais généraux de chargement/stockage est engagé. Toutefois, si vous trouvez un peu fastidieux, envisager d'utiliser l'emballage SimpleMath dans l'outil DirectX Kit pour DirectX 11/DirectX 12

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.

Voir DirectX Tool Kit for DirectX 12 tutorials et Getting Started with Direct3D 12.

+0

Merci. J'apprécie vraiment pour votre réponse. – Funastic

0

Vous êtes en droit de stocker un ou plusieurs XMVECTOR en tant qu'objets. Dans ce cas, vous devez vous assurer de respecter la contrainte d'alignement de XMVECTOR: 128 bits. C'est pourquoi ils introduisent le XMFLOATx pour gérer le stockage sans les exigences d'alignement.

Si vous ne le faites pas, vous risquez de provoquer des plantages et, au pire, des calculs incorrects. Cela est plus susceptible de se produire avec un exécutable 32bits lorsque new n'est pas nécessaire pour retourner un alignement de la mémoire sur au moins 16 octets.