続・DirectX11

先日のDirectXのスケルトンのような形から少しずつ手を加え、ひとまず複数のオブジェクトを描画できる状態にもってきました。

ここでオブジェクトごとに行列を持たせるようにクラスのメンバにXMMATRIX型のものを作っていたところ、コンパイル時に「ヒープで割り当てられたオブジェクトが 16 にアラインメントされていない可能性があります」という警告が出るようになりました。
さらに無視して続けていると
C2338 You’ve instantiated std::aligned_storage with an extended alignment (in other words, Align > alignof(max_align_t)). Before VS 2017 15.8, the member type would non-conformingly have an alignment of only alignof(max_align_t). VS 2017 15.8 was fixed to handle this correctly, but the fix inherently changes layout and breaks binary compatibility (*only* for uses of aligned_storage with extended alignments). Please define either (1) _ENABLE_EXTENDED_ALIGNED_STORAGE to acknowledge that you understand this message and that you actually want a type with an extended alignment, or (2) _DISABLE_EXTENDED_ALIGNED_STORAGE to silence this message and get the old non-conformant behavior.」という長いエラーが出て実行不能に。

どうもXMMATRIX型のアライメントが16バイトである関係上、make_sharedしたりすると正しい位置にメモリを確保できなくなってしまうようです。
しっかり対応するならnewの動作を上書きして云々、となるみたいですがそこまでするのは流石に大掛かりな感じがあります。
というわけでクラスのメンバとして持つ変数をXMMATRIXではなく、XMFLOAT4X4型に置き換えることで解決しました。

行列の計算に使うXMMatrixMultiply等の関数ではXMMATRIX型が必要になるため、その都度XMFLOAT4X4からXMMATRIXに変換して使うスタイルです。やや手間が増えますが致し方なし。
XMFLOAT4X4からXMMATRIXへの変換はXMLoadFloat4x4、逆はXMStoreFloat4x4関数で行えるみたいですね。
アライメントが16バイトに設定されているのは高速に処理を行うためのようで。似たような型が複数あって分かりにくいのもなるべくしてなったと云うべきか。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です