D3DXMATRIXA16
メソッドおよび operator オーバーロードを含む 4x4 の 16 バイトにアライメントされた行列です。
typedef struct D3DXMATRIXA16 {
FLOAT _ij;
} D3DXMATRIXA16, *LPD3DXMATRIXA16;
メンバ
- _ij
行列の (i, j) 成分です。i は行番号、j は列番号を表します。たとえば、_34 は [a34] と同じ意味になり、3 行目の 4 列目にある成分を表します。
解説
16 バイトにアライメントされた行列は、D3DX 算術関数で使用する場合は、Intel Pentium 4 プロセッサーでのパフォーマンスを向上させるために最適化されています。行列は、作成された場所に関係なくアライメントされます。つまり、プログラム スタック、ヒープ、またはグローバル スコープのいずれの場所に作成されたかは関係ありません。アライメントは、__declspec(align(16)) を使用して実行されます。これは Visual C++ .NET で動作し、プロセッサー パックがインストールされていれば、Visual C++ 6.0 でも動作します。ただし、プロセッサ パックを検出する方法がないので、バイト アライメントは Visual C++ .NET の場合にのみデフォルトでオンになります。
D3DX では、ベクトルおよびクオータニオンはバイト アライメントされません。D3DX 算術関数でベクトルおよびクオータニオンを使用する場合は、パフォーマンスを向上させるために、_declspec(align(16)) を使用してバイト アライメントされたベクトルおよびクオータニオンを生成します。_declspec の定義を次に示します。
#define D3DX_ALIGN16 __declspec(align(16))
他のコンパイラは、D3DXMATRIXA16 を D3DXMATRIX として解釈します。行列を実際にアライメントしないコンパイラでこの構造体を使用することには問題があります。これは、アライメントを無視するバグが通知されないためです。たとえば、D3DXMATRIXA16 オブジェクトが構造体またはクラスの内部にある場合に、memcpy が厳密なパックで実行される場合があります (16 バイト境界を無視)。これにより、コンパイラが行列のアライメントを追加した場合にビルドが壊れてしまいます。
D3DXMATRIXA16 の拡張機能
D3DXMATRIXA16 には次のような C++ 拡張機能があります。
typedef struct _D3DXMATRIXA16 : public D3DXMATRIX { _D3DXMATRIXA16(); _D3DXMATRIXA16( CONST FLOAT * f); _D3DXMATRIXA16( CONST D3DMATRIX& m); _D3DXMATRIXA16( FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14, FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24, FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34, FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44 ); void* operator new(size_t s); void* operator new[](size_t s); // The two operators below are not virtual operators. If you cast // to D3DXMATRIX, do not delete using them void operator delete(void* p); void operator delete[](void* p); struct _D3DXMATRIXA16& operator=(CONST D3DXMATRIX& rhs); } _D3DXMATRIXA16; typedef D3DX_ALIGN16 _D3DXMATRIXA16 D3DXMATRIXA16, *LPD3DXMATRIXA16;
要件
ヘッダー: D3DX10Math.h 宣言
ライブラリ: D3DX10.lib 内容