08/02/2020
游戏跨平台需要数学库
最近看了看PS4 SDK文档,也阅读了它们的数学库,它们的数学库与DirectX11中的数学库还是有区别的,为了完成SIMD指令集加速,它们通常由两个方式表示向量。
SIMD与SSE2指令集加速
SIMD(单指令多数据)可以仅使用一条指令就同时完成多个数据的运算或处理。
其中Intel处理器支持SSE2(SIMD流扩展2)指令集,提供了128位的寄存器,在硬件层面上可以做到同时进行4个32位float或者uint的运算,特别适合用于表示4D向量或者4x4的矩阵。而xna数学库正是利用了SSE2指令集来实现硬件加速,在运算性能上有所提升。
默认情况下,VS的项目会直接支持SSE2指令集。
DirectXMath
XMVECTOR 和XMFLOAT3 可以相互转换,XMFLOAT3仅仅保存向量的x,y,z的值,它并不用于直接计算,但是XMVECTOR用于数学计算,比如叉乘,点乘,乘法等等
XMVECTOR结构
typedef __m128 XMVECTOR;
//__m123 使用的是一个共用体Union
typedef union __declspec(intrin_type) __declspec(align(16)) __m128 {
float m128_f32[4];
unsigned __int64 m128_u64[2];
__int8 m128_i8[16];
__int16 m128_i16[8];
__int32 m128_i32[4];
__int64 m128_i64[2];
unsigned __int8 m128_u8[16];
unsigned __int16 m128_u16[8];
unsigned __int32 m128_u32[4];
} __m128;
可以发现,__m128是一种固有类型,并且在内存上严格要求按16字节对齐,即在内存上的地址最后一个十六进制值必须从0开始。除此之外,它还可以被表示成各种类型。在这里,内存要求对齐是因为寄存器从内存中读取或者写入数据也是直接按对齐的16字节进行的,确保快速读写。
XMFLOAT
如果需要存储向量,则应该用下面的这些类型来进行存储:
2D向量: XMFLOAT2(常用), XMINT2, XMUINT2
3D向量: XMFLOAT3(常用), XMINT3, XMUINT3
4D向量: XMFLOAT4(常用