1

我一直在使用

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

相当长一段时间。它工作得很好,直到我的屏幕变黑并在我的桌子上收到一大堆挫败感。

fxMatrix 包含 4 个 fxVector。fxVector 以前是 16 字节,现在突然变成 20 字节了。这是因为它继承了 fxStreamable,增加了 vTable。

因此,一种解决方案当然是不继承 fxStreamable,并留下评论说它必须始终为 16 字节,并且永远不会更多。

另一种解决方案是制作转换函数,并完全复制矩阵。这使它更安全,但对性能有影响。我想这是最好的主意。

另一种解决方案是根本不转换,并坚持使用 D3DXMATRIX,但这会使引擎不一致,我个人非常不喜欢这个想法。

你有什么意见?

4

4 回答 4

4

转换函数的影响很可能可以忽略不计。使用该解决方案,除非分析器可以证明它是一个瓶颈。这样的演员阵容确实相当邪恶,否则你不必问这个问题。

于 2011-01-03T11:52:36.970 回答
3

如果这样做,请添加断言或编译时测试:

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

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

对于奖励积分,还可以检查每个值是否在同一个位置。

但是,是的,它有点邪恶(比如核能),所以你应该采取适当的预防措施来处理它,或者根本不这样做。;)

于 2011-01-03T11:59:53.137 回答
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 回答
0

从两者继承,并使用 C++ 强制转换。然后 C++ 编译器将看到您的真实意图,并进行 4 字节调整。您不太可能看到 4 字节指针调整的效果。

于 2011-01-03T12:35:13.747 回答