访问 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 中的 XMVECTORXMMATRIX 类型正确对齐到 16 字节 (see the docs here),对于堆栈分配,这是自动的,但对于堆分配,您需要使用 @ 987654325@ 以获得正确对齐的内存。或者,您可以使用 XMFLOATnXMFLOATnxn 进行存储,并在实际使用它们时使用未对齐的矢量负载。

对于包含 XM 类型的类或结构,您可以通过重载 new 运算符来显式对齐分配来克服这个问题;最简单的方法是从这样的模板派生(注意:这并不完整,有几种类型的 operator newdelete):

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&lt;16&gt; /* rest of class */,您可以使用__alignof(XMVECTOR) 来进一步验证它以获得正确的对齐值。还记得 C++ 支持多重继承,因此您可以继承向量对象的分配策略,同时仍然从任何其他基类继承。

以上是关于访问 XMMATRIX 时 Dx11 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

关闭时访问崩溃

使用 UIImagePickerController 访问相册时应用崩溃

iPhone 应用程序在尝试访问 appDelegate 成员时崩溃

Cordova Ios 应用程序在相机访问时崩溃

重置存储时核心数据崩溃:“无法从此 NSManagedObjectContext 的协调器访问对象的持久存储”

从不同的 VC 访问时,带有完成处理程序的 API 调用函数崩溃