9

DirectX SDK のチュートリアルを見ていました。チュートリアル 5 は正常に動作しますが、コードをコピーして独自のクラスに分離した後、アプリケーションの起動中に奇妙なエラーが発生しました。

行は次のとおりです。

g_World1 = XMMatrixIdentity();

そのため、次のような xnamathmatrix.int operator= でエラーが発生しました。

XMFINLINE _XMMATRIX& _XMMATRIX::operator=
(
    CONST _XMMATRIX& M
)
{
    r[0] = M.r[0];
    r[1] = M.r[1];
    r[2] = M.r[2];
    r[3] = M.r[3];
    return *this;
}

エラーメッセージは次のとおりです。

Access violation reading location 0xffffffff

XMFLOAT4X4 / XMMATRIXに接続された何かが原因である可能性があることをどこかで読みました:

XMFLOAT4X4 を使用して行列を格納し、XMMATRIX のみを使用することを検討しましたか?

しかし、私はすでに XMMATRIX を使用していると思います。

MyClass.h:

private:
    XMMATRIX g_World1;

MyClass.cpp:

void init(){
   g_World1 = XMMatrixIdentity();
}

XMMATRIX g_World1; を変更する必要はないと思います。XMFLOAT4X4 g_World1 に、次のようなエラーが生成されるためです。

エラー C2679: バイナリ '=' : 'XMMATRIX' 型の右側のオペランドを取る演算子が見つかりません (または、受け入れ可能な変換がありません)

4

4 に答える 4

6

XMMATRIXは16バイトの整列された4x4マトリックスを表すため、g_World1の整列されていない割り当てにより、アクセス違反が発生します(簡単に言えば、g_World1のアドレスは16で割り切れません)。

ある種の解決策:構造体メンバーのアラインメントを16バイト有効にします(MyClassがg_World1を「インプレース」にするため)。ただし、MyClassインスタンスが16で割り切れるアドレスに存在することを確認する必要があります。

配置'new'演算子を使用して、MyClassオブジェクトを割り当てることができます。

アラインメントについてはこちらをご覧ください:ポインタをアラインメントする方法

于 2012-07-01T21:27:37.250 に答える
5

XMVECTOR と XMMATRIX は「登録プロキシ」タイプです。Xbox 360、Xbox One、および Windows x64 プラットフォームの型として安全に使用できます。これらはすべて、スタック上のデータとヒープに割り当てられたデータに対してネイティブに 16 バイトのアラインメントを持っているためです。

Windows 32 ビットまたは Windows RT/ARM でそれらを使用するには、ネイティブ アラインメントが 16 バイト未満であるため、より手間がかかります。1 つのアプローチは、DirectX ツール キットで使用される手法です... pImpl イディオムを使用し、pImpl 内部クラスは、XMVECTOR および XMMATRIX 型が直接使用される 16 バイト アラインメントで明示的に割り当てられます。もう 1 つのアプローチは、XMFLOAT4 や XMFLOAT4X4 などのさまざまな「ストレージ」タイプをすべて使用することです。

注: DirectXMath プログラマーズ ガイドでは、これについて説明しています。読むのに長い文書ではなく、多くのヒントと推奨事項が詰まっています。

PS: DirectX SDK を必要としない、MSDN コード ギャラリーの Win32 デスクトップ用の標準 Direct3D チュートリアルのバージョンがあります... VS 2012 または VS 2013 に含まれる Windows 8.x SDK を使用するだけです。ここにリンクの説明を入力してください。

于 2014-06-26T07:28:04.730 に答える
1

ありがとうございました。

最後に、XMLloadFloat4x4() および XMStoreFloat4x4() 関数を使用することにしました。クラスのメンバーを Float4x4 として保存し、render() ループごとに一時的に使用するためにそれらを XMMATRIX に変換します。しかし...それは速いですか、それともばかげた解決策ですか?

于 2012-07-01T23:02:24.000 に答える
1

「フランク・D・ルナ」の本「Directx 11を使用した3Dゲームプログラミングの紹介」では、次のように述べています。

XMMATRIX をクラスまたは構造体のメンバーとして使用しないでください。常に XMFloat4x4 を使用し、必要に応じてロードおよびストア バックします。

于 2014-06-24T22:18:28.497 に答える