2013-10-14 90 views
1

我正在使用DirectXMath,在類中創建XMMatrixXMVector16字節對齊問題

當我打電話給XMMatrixMultiply它會引發未處理的異常。

我在網上發現它是字節清除的問題,因爲DirectXMath使用SIMD指令集,導致錯誤的堆分配。

建議的解決方案之一是使用XMFLOAT4X4變量,然後在需要時將它們更改爲臨時XMMatrix,但它不是最好和最快的解決方案。

另一個是使用_aligned_malloc,但我不知道如何使用它。我從來沒有做過任何內存分配,這對我來說是黑魔法。

另一個,是超載new operator,但他們沒有提供任何信息如何做到這一點。

而關於超載方法,我沒有使用new來創建XMMatrix對象,因爲我沒有使用它們作爲指針。

這一切都很好,直到我決定將代碼分成類。

我認爲_alligned_malloc解決方案將是最好的,但我不知道如何使用它,何時何地調用它。

回答

1

與可安全存儲的XMFLOAT4X4和XMFLOAT4不同,XMMATRIX和XMVECTOR是硬件寄存器(SSE,NEON等)的別名。由於庫正在將註冊類型和對齊要求抽象出來,因此您不應該嘗試自己對齊類型,因爲您可以輕鬆創建一個恰好適用於您的計算機但在另一臺計算機上失敗的程序。您應該使用安全類型進行存儲(例如XMFLOAT4)或提取抽象並直接使用向量指令,並在應用程序中爲您嘗試支持的每個向量擴展使用特殊的存儲和對齊代碼路徑。

此外,在庫向量指令的上下文之外使用這些寄存器可能會由於其他原因導致意外故障。例如,如果將XMMATRIX存儲在您自己的結構中,則某些體系結構可能無法創建該結構的副本。

1

不假裝是一個完整的答案。

還有,你沒有提到的一些方法:

  • #define _XM_NO_INTRINSICS_。簡單。慢。現在工作,只需一行代碼。 ;)
  • 不要在堆上存儲XMVECTORXMMATRIX。存儲XMFLOAT4XMFLOAT4X4並僅在需要時才轉換爲SIMD類型(因此它們將存儲在堆棧中)。比較慢。許多代碼可能會改變(可能)。
  • 不要將XMVECTORXMMATRIX存儲在第2部分的堆上。只需將您的類存儲在堆棧中。快速。挺難的。許多代碼可能會改變(可能)。
  • 使用對齊的分配器。快速。硬。谷歌很多小時,許多代碼來編寫和調試。
  • 請勿使用DirectXMath(以前的XMMath)庫。選擇其他(有很多)或寫你自己的。快速。許多代碼可能會改變(可能)。

如果你想對齊分配器,它對DirectX或DirectXMath沒有任何影響。這是高級話題。沒有人能給你完整的解決方案。但是,這裏有谷歌搜索的一些成果:

要非常細心。使用錯誤的內存分配器可能會導致比解決問題多得多的問題。

希望它以某種方式幫助。快樂編碼! :)