【问题标题】:Memory Exception using XMFLOAT3 & XMVECTOR使用 XMFLOAT3 和 XMVECTOR 的内存异常
【发布时间】:2014-09-28 19:19:43
【问题描述】:

我正在尝试在 D3D 中为我的 Camera 类实现 Pitch/Yaw,但我的 Pitch() 函数会引发“访问冲突读取位置 0x0000008C”。

我用谷歌搜索了一下,发现由于 16 位对齐,我不能在类/结构中使用 XMVECTOR。但是我已经知道了,我仔细检查了它是否被声明为 XMFLOAT3 并且确实如此!

问题是,在我的相机类的所有其他函数中(比如更新视图矩阵,...)都不会抛出异常。就在这一个功能中!

所以,下面是我声明使函数崩溃的类变量的方法(尽管我的所有变量都会使其崩溃,并且它们的定义方式相同):

XMFLOAT3 mRight;

以下是我声明 Pitch 函数的方式:

void Pitch(float a)
{
    //Here it makes my code crash
    XMMATRIX R = XMMatrixRotationAxis(XMLoadFloat3(&mRight), a);

    //Store and compute
    XMStoreFloat3(&mLook, XMVector3TransformNormal(XMLoadFloat3(&mLook), R));
    XMStoreFloat3(&mUp, XMVector3TransformNormal(XMLoadFloat3(&mUp), R));
}

我也使用 x86 作为架构,尽管 x64 给出了完全相同的结果(除了内存位置:D)。 I 或 DirectXMath 库都无法访问“mRight”的 x、y 和 z 值。在我的例子中,DirectXMath 中的“mRight.x”是“__m128 x = _mm_load_ss(&pSource->x);”。

一些新的调试结果: 当我从 WM_MOUSEMOVE 事件中调用“任何”函数时,会发生这种奇怪的情况。甚至我的函数 Walk(),当我按下一个键时调用它时它也能完美运行。

有史以来最奇怪的事情!

感谢您的帮助!

【问题讨论】:

  • 你的目标架构是什么? x86 还是 x64?如果你正在为 x86 构建,那么你不能假设你的变量是 16 位对齐的。此外,如果您使用调试器单步执行代码以准确查看异常发生的位置,可能会更有帮助。这很容易,因为 DirectXMath 是开源的。
  • 我的目标架构是 x86,尽管 x64 给出了相同的结果。 2 分:我确实这样做了,它发生在我(或 DirectXMath)尝试访问 x、y、z 位置“mRight”时。在 DirectXMath 的情况下,它位于“__m128 x = _mm_load_ss( &pSource->x );”感谢您的帮助顺便说一句

标签: c++ direct3d memory-alignment directxmath


【解决方案1】:

我知道我的错误!!我给了我使用该代码的类的无效指针:D 修复了它

【讨论】:

  • 如果你打算使用这个模式,你可能想看看在DirectX Tool Kit 中使用 SimpleMath。
猜你喜欢
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多