次の方法で共有


D3DXMATRIXA16 構造体 (D3dx9math.h)

Note

D3DX ユーティリティ ライブラリは非推奨です。 代わりに DirectXMath を使用することをお勧めします。

メソッドと演算子のオーバーロードを含む 4 x 4 の 16 バイトアライン行列。

構文

typedef struct D3DXMATRIXA16 {
  FLOAT _ij;
} D3DXMATRIXA16, *LPD3DXMATRIXA16;

メンバー

_Ij

型: FLOAT

行列の (i, j) コンポーネント。ここで、i は行番号、j は列番号です。 たとえば、_34 は、[a₃₄] と同じで、3 行目と 4 列目のコンポーネントを意味します。

解説

D3DX 数学関数で使用される 16 バイトアラインマトリックスは、Intel Pentium 4 プロセッサのパフォーマンスを向上させるために最適化されています。 マトリックスは、プログラム スタック、ヒープ、またはグローバル スコープの作成場所とは関係なく配置されます。 配置は、プロセッサ パックがインストールされている場合にのみ Visual C++ .NET と Visual C++ 6.0 で動作する __declspec(align(16)) を使用して実現されます。 残念ながら、プロセッサ パックを検出する方法がないため、バイトアラインメントは 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;

要件

要件
ヘッダー
D3dx9math.h

関連項目

D3DX 構造体

D3DXMATRIX