1

我正在使用DirectXMath、创建XMMatrixXMVector上课。

当我调用XMMatrixMultiply它时,它会引发未处理的异常。

我在网上发现这是字节对齐的问题,因为DirectXMath使用SIMD的指令集会导致未对齐的堆分配。

建议的解决方案之一是使用XMFLOAT4X4变量,然后XMMatrix在需要时将它们更改为临时变量,但这不是 imo 最好和最快的解决方案。

另一个是使用_aligned_malloc,但我不知道如何使用它。我从来不需要做任何内存分配,这对我来说是黑魔法。

另一个是超载new operator,但他们没有提供任何信息如何做到这一点。

关于重载方法,我不使用new创建XMMatrix对象,因为我不使用它们作为指针。

在我决定将代码拆分为类之前,一切都很好。

我认为_alligned_malloc解决方案在这里是最好的,但我不知道如何使用它,何时何地调用它。

4

2 回答 2

2

与可以安全存储的 XMFLOAT4X4 和 XMFLOAT4 不同,XMMATRIX 和 XMVECTOR 是硬件寄存器(SSE、NEON 等)的别名。由于库正在抽象出寄存器类型和对齐要求,因此您不应该尝试自己对齐类型,因为您可以轻松创建一个恰好在您的机器上运行但在另一台机器上失败的程序。您应该使用安全类型进行存储(例如 XMFLOAT4)或提取抽象并直接使用向量指令,在您的应用程序中为您尝试支持的每个向量扩展提供特殊的存储和对齐代码路径。

此外,在库的向量指令上下文之外使用这些寄存器可能会由于其他原因导致意外失败。例如,如果您将 XMMATRIX 存储在自己的结构中,某些体系结构可能无法创建该结构的副本。

于 2013-10-14T19:59:09.427 回答
1

不要假装是一个完整的答案。

有些方法你没有提到:

  • #define _XM_NO_INTRINSICS_. 简单的。减缓。现在可以使用,只需一行代码。;)
  • 不要XMVECTOR堆放XMMATRIX。仅在需要时存储XMFLOAT4XMFLOAT4X4转换为 SIMD 类型(因此它们将存储在堆栈中)。慢点。许多代码要更改(可能)。
  • 不要将XMVECTOR和存储XMMATRIX在堆上,第 2 部分。只需将您的类存储在堆栈上。快速地。挺难的。许多代码要更改(可能)。
  • 使用对齐的分配器。快速地。难的。google 好几个小时,编写和调试许多代码。
  • 不要使用 DirectXMath(以前的 XMMath)库。选择任何其他(有很多)或自己写。快速地。许多代码要更改(可能)。

如果你想要对齐的分配器,它与 DirectX 或 DirectXMath 无关。是高级话题。没有人能给你完整的解决方案。但是,这里有一些谷歌搜索的结果:

要非常专心。使用糟糕的内存分配器,您可以引入比解决更多的问题。

希望它以某种方式有所帮助。快乐编码!:)

于 2013-10-15T21:25:19.093 回答