访问 XMMATRIX 时 Dx11 崩溃
Posted
技术标签:
【中文标题】访问 XMMATRIX 时 Dx11 崩溃【英文标题】:Dx11 Crash when accessing XMMATRIX 【发布时间】:2014-03-02 21:29:40 【问题描述】:我一直在 DirectX 11 中创建一个植绒群项目,并在尝试创建指向对象的指针向量时出现错误,并且在第三次推回迭代时它会崩溃并跳转到此:
XMFINLINE _XMMATRIX& _XMMATRIX::operator=
(
CONST _XMMATRIX& M
)
r[0] = M.r[0];
r[1] = M.r[1];
r[2] = M.r[2];
r[3] = M.r[3];
return *this;
当我执行此代码时发生崩溃:
Populate();
for (unsigned int i = 0; i < m_numOfPrey; i++)
m_preyVec[i]->LoadContent(dx, colour, yaw, pitch, roll, scale);
srand (time(NULL));
XMFLOAT3 tempPos;
tempPos.x = rand() % 40;
tempPos.y = rand() % 40;
tempPos.z = rand() % 40;
m_preyVec[i]->SetPosition(tempPos);
return true;
填充函数:
for (unsigned int i = 0; i < m_numOfPrey; i++)
Prey* newPrey = new Prey();
m_preyVec.push_back(newPrey);
编辑:猎物继承自车辆类(它为使用我的猎物和捕食者的车辆构建缓冲区、FX 和 InputLayout。
所以这是 Prey LoadContent();
Vehicle::LoadContent(dx, colour, yaw, pitch, roll, scale);
return true;
这是 Vehicle LoadContent();
if(!GameObject::LoadContent(dx, m_position, colour, yaw, pitch, roll, scale))
return false;
if(!BuildBuffers(dx))
return false;
if(!BuildFX(dx))
return false;
if(!BuildInputLayout(dx))
return false;
return true;
任何帮助将不胜感激,如果我需要提供更多信息,我也可以这样做,因为我已经坚持了好几天了,我确信这是我遗漏或做错的小事。
【问题讨论】:
向我们展示Prey
的构造函数。
【参考方案1】:
您需要确保 DXMath 中的 XMVECTOR
和 XMMATRIX
类型正确对齐到 16 字节 (see the docs here),对于堆栈分配,这是自动的,但对于堆分配,您需要使用 @ 987654325@ 以获得正确对齐的内存。或者,您可以使用 XMFLOATn
和 XMFLOATnxn
进行存储,并在实际使用它们时使用未对齐的矢量负载。
对于包含 XM 类型的类或结构,您可以通过重载 new
运算符来显式对齐分配来克服这个问题;最简单的方法是从这样的模板派生(注意:这并不完整,有几种类型的 operator new
和 delete
):
template <size_t align> class AlignedAllocPolicy
public:
void* operator new(std::size_t size)
return _aligned_malloc(size,align);
void operator delete(void* mem)
_aligned_free(mem);
【讨论】:
我在这里可能真的很密集,不明白这一点,为了澄清问题似乎是向量,因为它在尝试将对象推回向量的第 3 次迭代时出错。我应该将推送到向量中的 Prey 对象指针对齐到 16 字节吗?如果是的话,有什么线索吗? :D 非常感谢您的帮助。 @TimLewis: 是的,您使用 XMVECTOR 或 XMMATRIX 创建的任何类或结构 必须 使用我上面提供的模板进行 16 字节对齐,只需更改您的Prey
定义为:__declspec(align(16)) class Prey : public AlignedAllocPolicy<16> /* rest of class */
,您可以使用__alignof(XMVECTOR)
来进一步验证它以获得正确的对齐值。还记得 C++ 支持多重继承,因此您可以继承向量对象的分配策略,同时仍然从任何其他基类继承。以上是关于访问 XMMATRIX 时 Dx11 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
使用 UIImagePickerController 访问相册时应用崩溃
iPhone 应用程序在尝试访问 appDelegate 成员时崩溃