У меня возникли проблемы с установкой двух переменных типа XMMATRIX ** в функции. Прототип функции выглядит так:
bool ViewportFactory::CreateViewport(CanvasHandle* canvasHandlePtr, ViewportHandle** outViewportHandlePtr, DirectX::XMMATRIX** outProjectionMatrix, DirectX::XMMATRIX** outViewMatrix)
Затем, позже в определении функции, у меня есть следующие две строки:
*outProjectionMatrix = new DirectX::XMMATRIX(0.0f, 0.1f, /* ... */, 3.3f);
*outViewMatrix = new DirectX::XMMATRIX(0.0f, 0.1f, /* ... */, 3.3f);
Однако в сборке Win32 с включенными оптимизациями эти строки дают мне нарушение прав доступа.
Трудно понять, в чем именно проблема с включенной оптимизацией, но если я изменю эти строки, чтобы установить значения на nullptr
, то проблема уходит.
Это действительно проблема выравнивания. новый DirectX :: XMMATRIX в 32-битной программе выровнен только на 8 байтов, а XMMATRIX должен быть выровнен на 16 байтов.
Вы можете либо использовать __aligned_malloc / __ aliged_free вместо new, либо использовать тип XMFLOAT4X4. Или вместо того, чтобы выделять отдельные значения XMMATRIX из кучи, используйте вместо этого выделенный в стеке XMMATRIX, который будет правильно выровнен, поскольку XMMATRIX помечен как __declspec (align (16)).
Это описано в Руководстве по программированию DirectXMath на MSDN. Это не длинный документ, и он содержит много советов.