访问XMMATRIX时Dx11崩溃

时间:2014-03-02 21:29:40

标签: c++ directx directx-11

我一直在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;
}

任何帮助都会受到赞赏,如果我需要提供更多信息,我也可以这样做,因为我已经坚持了好几天,我确信它是一些小的,我错过了或做错了。< / p>

1 个答案:

答案 0 :(得分:4)

您需要确保XMVECTOR&amp; DXMath中的XMMATRIX类型正确对齐到16字节(see the docs here),对于堆栈分配,这是自动的,但对于堆分配,您需要使用_aligned_malloc来获得正确对齐的内存。或者,您可以使用XMFLOATnXMFLOATnxn存储,并在实际使用时使用未对齐的矢量加载。

对于包含XM类型的类或结构,您可以通过重载new运算符来明确对齐分配来克服这个问题;最简单的方法是从这样的模板派生(注意:这不完整,有几种operator new&amp; 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);
    }
}