D3DXMATRIXA16 構造体
D3DXMATRIXA16 構造体
16 バイト アラインメントの行列を定義する。
構文
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;
注意
16 バイト アラインメントの行列は、Direct3D エクステンション (D3DX) の算術関数で使われる場合、Pentium 4 プロセッサでのパフォーマンスを上げるために最適化されている。行列は、プログラム スタック、ヒープ、グローバル スコープなどの行列の作成場所に関係なくアラインメントされる。アラインメントは __declspec(align(16)) を使って行われ、これは Microsoft® Visual C++® .NET と Visual C++ 6.0 ではプロセッサ パックがインストールされている場合にのみ動作する。ただし、プロセッサ パックを検出する方法はないため、デフォルトでバイト アラインメントが有効なのは Visual C++ .NET のみである。
D3DX では、ベクトルとクォータニオンはバイト アラインメントされない。D3DX の算術関数でベクトルやクォータニオンを使う場合は、_declspec(align(16)) を使ってバイト アラインメントのベクトルまたはクォータニオンを生成する。 その方が、パフォーマンスが大幅に向上する。_declspec の定義を次に示す。
#define _ALIGN_16 __declspec(align(16))
他のコンパイラでは、D3DXMATRIXA16 を D3DXMATRIX と解釈する。実際には行列のアラインメントを行わないコンパイラでこの構造体を使うと、アラインメントを無視してしまうというバグを発見できずに、問題が起きることがある。たとえば、D3DXMATRIXA16 オブジェクトが構造体またはクラスの内側にある場合、memcpy は密にパックした (16 バイト境界を無視) 状態で実行される。その結果、コンパイラがある時点で行列のアラインメントを追加することになっていた場合には、ビルドが中断する可能性がある。
構造体の情報
ヘッダー | d3dx9math.h |
必要な最低バージョン | DirectX 9.0 |
最低限のオペレーティング システム | Windows 2000、Windows 98 |