2015-10-19 122 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

感谢您的全力帮助,我确实解决了这个问题,但没有看到您的答案,并发现它是因为堆,但考虑到您的解决方案实际上更加优雅,并且正确地解释我的问题是我接受它:) –