gpt4 book ai didi

c++ - 访问 XMMATRIX 时 Dx11 崩溃

转载 作者:行者123 更新时间:2023-11-30 01:54:22 24 4
gpt4 key购买 nike

我一直在 DirectX 11 中创建蜂群项目,但在尝试创建指向对象的指针 vector 时出现错误,在推回的第 3 次迭代中它会崩溃并跳转到此:

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);
}

编辑:prey 继承自车辆类(它为使用我的 Prey 和 Predator 的车辆构建缓冲区、FX 和 InputLayout。

所以这是猎物 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;
}

任何帮助将不胜感激,如果我需要提供更多信息,我也可以这样做,因为我已经坚持了好几天,我确信这是我遗漏或做错的小事。

最佳答案

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

对于包含 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);
}
}

关于c++ - 访问 XMMATRIX 时 Dx11 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22133742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com