2013-10-14 6 views
1

XMMatrixXMVector을 클래스로 사용하여 DirectXMath을 사용 중입니다.16 바이트 정렬 문제

XMMatrixMultiply을 호출하면 처리되지 않은 예외가 발생합니다.

DirectXMathSIMD 명령어 세트를 사용하므로 잘못 정렬 된 힙 할당을 초래하므로 온라인에서 바이트 악센트가있는 것으로 나타났습니다.

제안 된 솔루션 중 하나는 XMFLOAT4X4 개의 변수를 사용하고 필요할 때마다 임시 XMMatrix으로 변경하는 것이었지만 가장 좋고 빠른 해결책은 아닙니다.

또 다른 하나는 _aligned_malloc을 사용했지만 아직 사용 방법을 모릅니다. 나는 어떤 메모리 할당도 할 필요가 없었고 그것은 나를 위해 검은 마법이다.

또 다른 하나는 new operator을 오버로드하는 것이었지만 아직 어떻게해야하는지에 대한 정보는 제공하지 않았습니다.

오버로드 방법과 관련하여 포인터로 사용하지 않기 때문에 XMMatrix 개체를 만들 때 new을 사용하지 않습니다.

코드를 클래스로 분할하기 전까지는 모두 잘 작동했습니다.

나는 여기서 _alligned_malloc 해결책이 가장 좋을 것이라고 생각하지만, 그것을 사용하는 방법을 알지 못한다.

답변

1

XMFLATATXX 및 XMFLOAT4는 저장하기에 안전하지 않지만 하드웨어 레지스터 (SSE, NEON 등)의 별명입니다. 라이브러리는 레지스터 유형 및 정렬 요구 사항을 추상화하고 있으므로 시스템에서 작동하지만 다른 시스템에서는 작동하지 않는 프로그램을 쉽게 만들 수 있으므로 유형을 직접 정렬하지 마십시오. 저장을 위해 안전한 유형 (예 : XMFLOAT4)을 사용하거나 추상화를 풀고 지원하려는 각 벡터 확장에 대한 응용 프로그램의 특수 저장소 및 정렬 코드 경로를 사용하여 벡터 명령어를 직접 사용해야합니다.

또한 라이브러리 벡터 명령의 컨텍스트 외부에서 이러한 레지스터를 사용하면 다른 이유로 인해 예기치 않은 오류가 발생할 수 있습니다. 예를 들어, 자신의 구조체에 XMMATRIX를 저장하면 일부 아키텍처에서는 구조체의 복사본을 만들지 못할 수 있습니다.

1

완전한 답변을 제공하지 않습니다.

  • #define _XM_NO_INTRINSICS_을 :

    는 언급하지 않았다 몇 가지 방법이 있습니다. 단순한. 느린. 이제는 코드 한 줄만 있으면됩니다. ;)

  • XMVECTORXMMATRIX을 힙에 저장하지 마십시오. XMFLOAT4 또는 XMFLOAT4X4을 저장하고 필요한 경우에만 SIMD 유형으로 변환하십시오 (따라서 스택에 저장됩니다). 천천히. 변경할 많은 코드 (아마).
  • XMVECTORXMMATRIX을 힙 2에 저장하지 마십시오. 클래스를 스택에 저장하기 만하면됩니다. 빠른. 꽤 열심히. 변경할 많은 코드 (아마).
  • 정렬 된 할당자를 사용하십시오. 빠른. 단단한. 많은 시간을 구글, 많은 코드를 작성하고 디버깅합니다.
  • DirectXMath (이전의 XMMath) 라이브러리를 사용하지 마십시오. 다른 것을 선택하거나 (충분히 있습니다) 직접 작성하십시오. 빠른. 변경할 많은 코드 (아마).

정렬 된 할당자를 원하면 DirectX 또는 DirectXMath에 아무 것도 없습니다. 고급 주제입니다. 아무도 완벽한 솔루션을 제공 할 수 없습니다.

매우 세심 :하지만, 여기에 인터넷 검색의 일부 결과입니다. 나쁜 메모리 할당자를 사용하면 해결하는 것보다 훨씬 더 많은 문제를 도입 할 수 있습니다.

어떻게 든 도움이 되길 바랍니다. 해피 코딩! :)