- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的 Win32、DirectX 游戏在处理 vector 和矩阵的代码中以 Release模式崩溃。具体来说,崩溃发生在这条指令上:
014E2752 unpcklps xmm1,xmmword ptr [esp+3Ch]
First-chance exception at 0x014E2752 in RodinaRelease.exe: 0xC0000005: Access violation reading location 0xFFFFFFFF
我不太了解汇编和寄存器,但看起来 esp = 0x0043f31c
会使 esp+3Ch = 0x0043f358
现在,根据this和 this , unpcklps
指令是一条 SSE 指令,需要 16 字节对齐。 0x0043f358
不是 16 字节对齐的,对吗?我认为堆栈对齐是我崩溃的原因是否正确?
如果是这样,我做了什么值得这样????我在我的游戏中不使用 SSE 指令,所以我可以忽略像这样的对齐问题——这是天真/错误吗?有什么办法可以关闭此行为吗?
相关要点:
我最近升级到 Visual Studio 2013,我怀疑这个错误是在这个时候出现的。我找到了一个 bug report这与我的问题类似。
我的游戏使用 XNAMath,特别是 XMMATRIX 和 XMVECTOR。通常这需要我对齐所有内容。但是,因为我不想遇到这样的问题,所以我使用 _XM_NO_INTRINSICS_ 标志进行编译,该标志应该关闭 XNAMath 对 SIMD 指令的使用。直到现在,这似乎从来都不是一个问题。我正在处理的具体崩溃与我自己的 vector 类型有关,但它与 XMMATRIX 代码非常接近,我相信它们都是通过优化混合在一起的。
我的游戏构建为 Win32 应用程序。切换到 x64 是解决这个问题的可行解决方案还是太荒谬了?我不知道除了需要获得我使用的 64 位版本的库之外还会有什么后果。
最佳答案
参见 this answer了解更多详情。
请记住,用于 x86 的 VS 2013 默认使用 /arch:SSE2
,因此即使定义了 _XM_NO_INTRINSICS_
,编译器仍将使用 SSE/SSE2。出于这个原因,您可能应该停止使用 _XM_NO_INTRINSICS_
,让您的代码正确使用 DirectXMath 或 XNAMath。
也就是说,您可以尝试使用 /arch:IA32
进行构建,以强制 Visual Studio 使用旧式 x87 而不是 SSE/SSE2...
关于c++ - 这是数据对齐崩溃吗? (可能涉及堆栈错位、XNAMath、Visual Studio 2103),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30267730/
我测试了 XNAMath 的性能,看起来在我的 PC 版本上,带有 SIMD 内在函数的性能低于没有 simd 的性能。 我使用计算点积的函数。我在没有 simd 的情况下测试了这段代码: XMVEC
我最近开始分析和优化一个 DirectX 11 应用程序,该应用程序以前是使用 x64 平台配置开发的。在切换到 x86 以测试使用扩展指令集时的行为后,我开始注意到我的某些对象被优化掉了,最具体的是
我的 Win32、DirectX 游戏在处理 vector 和矩阵的代码中以 Release模式崩溃。具体来说,崩溃发生在这条指令上: 014E2752 unpcklps xmm1,xmmword p
我是 DirectX 编程和 Visual C++ 的新手,并且在将我从 xnamath.h 找到的示例迁移到 DirectXMath.h 时遇到了问题。我正在使用 Visual Studio 201
我有一些使用 xnamath.h 的 DirectX C++ 代码。我想迁移到“全新的”DirectXMath,所以我改变了: #include 到 #include 我还添加了 DirectX
我是一名优秀的程序员,十分优秀!