2013-10-14 1 views
1

Я использую DirectXMath, создавая XMMatrix и XMVector в классах.16 байт выравнивание выпуск

Когда я звоню XMMatrixMultiply, он выдает на него необработанное исключение.

Я нашел онлайн, что это проблема с байтовым аллигментом, так как DirectXMath использует набор SIMD, который приводит к распределению распределенных распределений.

Одно из предлагаемых решение предназначено для использования переменных XMFLOAT4X4, а затем изменить их на временный XMMatrix всякий раз, когда это необходимо, но это не самое приятное и быстрое решение imo.

Другой должен был использовать _aligned_malloc, но я понятия не имею, как его использовать. Мне никогда не приходилось делать какие-либо выделения памяти, и для меня это черная магия.

Другой, должен был перегрузить new operator, но они не предоставили никакой информации, как это сделать.

И что касается метода перегрузки, я не использую new для создания объектов XMMatrix, так как я не использую их в качестве указателей.

Все было хорошо, пока я не решил разбить код на классы.

Я думаю, что решение было бы лучше всего здесь, но я понятия не имею, как его использовать, где и когда его называть.

ответ

1

В отличие от XMFLOAT4X4 и XMFLOAT4, которые безопасны для хранения, XMMATRIX и XMVECTOR являются псевдонимами для аппаратных регистров (SSE, NEON и т. Д.). Поскольку библиотека абстрагирует требования к типу регистров и требованиям к выравниванию, вы не должны пытаться самостоятельно выровнять типы, так как вы можете легко создать программу, которая работает на вашем компьютере, но не сработает с другой. Вы должны либо использовать безопасные типы для хранения (например, XMFLOAT4), либо подтягивать абстракцию, а напрямую использовать векторные инструкции, со специальными кодами хранения и выравнивания кода в приложении для каждого поддерживаемого вами векторного расширения.

Кроме того, использование этих регистров вне контекста векторных инструкций библиотеки может привести к неожиданным сбоям по другим причинам. Например, если вы храните XMMATRIX в своей собственной структуре, некоторые архитектуры могут не создавать копии структуры.

1

Не претендуйте на полный ответ.

Есть несколько способов, которые вы не упомянули:

  • #define _XM_NO_INTRINSICS_. Просто. Медленный. Работает прямо сейчас, только одна строка кода. ;)
  • Не хранить XMVECTOR и XMMATRIX в куче. Храните XMFLOAT4 или XMFLOAT4X4 и конвертируйте в типы SIMD только при необходимости (чтобы они были сохранены в стеке). Помедленнее. Много кода для изменения (возможно).
  • Не храните XMVECTOR и XMMATRIX на куче, часть 2. Просто сохраните свои классы в стеке. Быстро. Довольно сложно. Много кода для изменения (возможно).
  • Используйте выровненный распределитель. Быстро. Жесткий. Много часов в Google, много кода для написания и отладки.
  • Не используйте библиотеку DirectXMath (ранее XMMath). Выберите любой другой (есть много) или напишите сами. Быстро. Много кода для изменения (возможно).

Если вы хотите выровнять распределитель, он не имеет ничего для DirectX или DirectXMath. Это продвинутая тема. Никто не может дать вам полное решение. Но, вот некоторые результаты: прибегая к помощи

Будьте очень внимательны. С плохим распределителем памяти вы можете ввести гораздо больше проблем, чем решить.

Надеюсь, что это поможет. Счастливое кодирование! :)