2015-10-19 160 views
-1

我有一個DirectX 11項目,我使用Beginning DirectX 11 Game Programming書通過所有章節。我有我的相機的地方,它一直在沒有崩潰,但最近在調試我的Obj Loader時我發現它在XMMatrixTranspose線路上不斷崩潰,我換了我的視圖矩陣和投影矩陣來查看是否它是特定於我的觀點矩陣而不是。XMMatrixTranspose訪問衝突讀取位置0xFFFFFFFF

這裏的代碼導致錯誤

vMatrix = camera.GetViewMatrix(); 
vMatrix = XMMatrixTranspose(vMatrix); 

pMatrix = XMMatrixPerspectiveFovLH(XM_PIDIV4, (float)(screenWidth/screenHeight), 0.01f, 100.0f); 
pMatrix = XMMatrixTranspose(pMatrix); 

塊這是我DX11::Render功能找到。這在我的main.cpp遊戲循環中被調用,如下所示。

MSG msg = { 0 }; 

while (msg.message != WM_QUIT) 
{ 
    if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    else 
    { 
     directX->Update(0.0f); 
     directX->Render(); 
    } 
} 

directX->Shutdown(); 

我的變量的所有記憶和該代碼已經工作之前,當它開始這樣做,它會做得很間歇,但現在​​它似乎是在做這一切的時候。

任何幫助和指導將是驚人的!我一直在研究幾個小時,找不到任何有用的東西,我已經有了這個問題約7個小時!它要走了!

在此先感謝。

UPDATE現在已經回到了間歇性崩潰

更新2我還使用xnamath不DXMath

+0

的可能的複製[DX11崩潰時訪問XMMATRIX],因爲這是使用XMMatrixTranspose功能(http://stackoverflow.com/questions/22133742/dx11-crash-when-accessing-xmmatrix) –

+0

是。 –

+0

Zach,XMMATRIX變量未對齊的問題是衆所周知的,並給出了您所看到的症狀。我建議你嘗試鏈接答案中的建議。 –

回答

1

應該先閱讀MSDN程序員指南,特別是type usage guidelines

DirectXMath和XNAMath基本上是相同的庫。 XNAMath只是2011年上次更新的舊版本。您應該轉向使用DirectXMath。見this blog post

最有可能的問題是,你要使用XMMATRIX和/或在堆上聲明XMMVECTOR類型(即您使用new一類),這將正確的x86對齊(32位)和ARM構建。它恰好與x64原生代碼對齊,但這主要是一個快樂事故。

換句話說,下面的代碼將導致86(32位)和ARM的AV這依賴於內存的佈局方式,而是將工作針對x64原生:

struct A 
{ 
    XMMATRIX m; 
}; 

A a = new A; 
a->m = XMMatrixIdentity(); 

要使它在所有體系穩健運行,你需要使用:

你會使用XMFLOAT4X4或相似類型不需要對準你的類,然後使用顯式加載/保存功能。請注意,根據您的矩陣內容,您還可以使用更緊湊的形式,如XMFLOAT4X3

或者,您可以使用DirectX Tool Kit中的SimpleMath包裝器,該包裝器只會通過C++轉換運算符和構造函數的「自動」操作。

struct A 
{ 
    Matrix m; 
}; 

A a = new A; 
A->m = XMMatrixIdentity(); 
// Note this is redundant 
// as the Matrix default constructor sets it to identity already. 

此功能不是基礎庫的一部分,因爲它有一些性能問題。通過將其作爲SimpleMath包裝器的一部分,它允許用戶選擇使用更簡單的使用模型,同時防止意外使用其他人使用速度較慢的轉換路徑。

+0

感謝您的全力幫助,我確實解決了這個問題,但沒有看到您的答案,並發現它是因爲堆,但考慮到您的解決方案實際上更加優雅,並且正確地解釋我的問題是我接受它:) –