访问冲突读取位置0xFFFFFFFF

XMMatrixTranspose Access violation reading location 0xFFFFFFFF

本文关键字:0xFFFFFFFF 位置 读取 访问冲突      更新时间:2023-10-16

我有一个DirectX 11项目,我使用Beginning DirectX 11 Game Programming书通过所有章节。我有我的相机到位,它一直没有崩溃,但最近当调试我的Obj Loader我发现它一直崩溃在XMMatrixTranspose行,我已经交换了我的视图矩阵和投影矩阵,看看它是否特定于我的视图矩阵,它不是。

下面是导致错误

的代码块
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现在已经回到间歇性崩溃

UPDATE 2我也使用xnamath而不是DXMath

您应该首先阅读MSDN程序员指南,特别是类型使用指南。

DirectXMath和XNAMath基本上是相同的库。XNAMath只是它的旧版本,上一次更新是在2011年。你应该转而使用DirectXMath。请看这篇博文。

最有可能的问题是,你试图使用在堆上声明的XMMATRIX和/或XMMVECTOR类型(即在你使用new的类中),这将正确对齐x86(32位)和ARM构建。它恰好与x64本机代码对齐,但这主要是一个愉快的意外。

换句话说,以下代码将导致x86(32位)和ARM的AV,具体取决于内存的布局,但将适用于x64本机:

struct A
{
    XMMATRIX m;
};
A a = new A;
a->m = XMMatrixIdentity();

要使它在所有架构上健壮地工作,您需要使用:

struct A
{
    XMFLOAT4X4 m;
};
A a = new A;
XMStoreFloat4x4(&A->m, XMMatrixIdentity());

你会使用XMFLOAT4X4或类似的类型,不需要在你的类中对齐,然后使用显式的Load/Save函数。请注意,您还可以使用更紧凑的形式,如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包装器的一部分,它允许用户选择更简单的使用模型,同时防止意外地为其他人使用较慢的转换路径。