1

使ってきました

matrix = *((fxMatrix*)&d3dMatrix);

かなり長い間。画面が真っ暗になり、机の上でバケツのフラストレーションが溜まるまでは問題なく動作していました。

fxMatrix には 4 つの fxVectors が含まれています。fxVector は以前は 16 バイトでしたが、突然 20 になりました。これは、vTable を追加した fxStreamable を継承したためです。

したがって、1 つの解決策はもちろん、fxStreamable を継承せず、常に 16 バイトである必要があり、それ以上であってはならないというコメントを残すことです。

別の解決策は、変換関数を作成し、行列を完全にコピーすることです。これにより、より安全になりますが、パフォーマンスに影響します。これが一番いい考えだと思います。

もう 1 つの解決策は、まったく変換せずに D3DXMATRIX に固執することですが、これではエンジンに一貫性がなくなり、個人的にはこの考えが本当に嫌いです。

あなたの意見は何ですか?

4

4 に答える 4

4

変換関数の影響はごくわずかかもしれません。プロファイラーがそれがボトルネックであることを証明できない限り、その解決策を使用してください。そのようなキャストは確かにかなり悪いです。そうでなければ、この質問をする必要はありません。

于 2011-01-03T11:52:36.970 に答える
3

明示的な代入演算子を作成できます。

// Code Was this:
matrix = *((fxMatrix*)&d3dMatrix);

// Add the assignment operator
class fxMatrix
{
    // STUFF
    fxMatrix& operator=(D3DXMATRIX const& rhs)
    {
         // Explicitly copy.
             // Do in here what you were letting the compiler do before.
         return *this;
    }
    // STUFF
};
// New Code
matrix = d3dMatrix;
于 2011-01-03T12:20:55.100 に答える
3

これを行う場合は、アサートまたはコンパイル時のテストを追加します。

assert(sizeof(fxMatrix) == sizeof(D3DMatrix));

BOOST_STATIC_ASSERT(sizeof(fxMatrix) == sizeof(D3DMatrix));

ボーナス ポイントについては、各値が同じ場所にあることを確認することもできます。

しかし、ええ、それは一種の悪(原子力のようなもの)なので、適切な予防措置を講じて取り扱うか、まったく行わないかのどちらかです. ;)

于 2011-01-03T11:59:53.137 に答える
0

両方から継承し、C++ キャストを使用します。C++ コンパイラは、ユーザーの真の意図を認識し、4 バイトの調整を行います。4 バイトのポインター調整の効果が見られる可能性はほとんどありません。

于 2011-01-03T12:35:13.747 に答える