在DirectX Math中,向量的核心数据类型为 XMVECTOR
,使用了SIMD指令集加速。
下面引用百度对SIMD的介绍:
Single Instruction Multiple Data,单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。
SSE2指令集:
SSE2(Streaming SIMD Extensions 2,Intel官方称为SIMD 流技术扩展 2或数据流单指令多数据扩展指令集 2)指令集是Intel公司在SSE指令集的基础上发展起来的。相比于SSE,SSE2使用了144个新增指令,扩展了MMX技术和SSE技术,这些指令提高了广大应用程序的运行性能。
XMVECTOR
的定义类似这样:typedef __m128 XMVECTOR;
当我们使用它进行计算时,只利用了我们需要的维度数据,其他维度数据被置为0
XMVECTOR
要求16字节对齐,对于全局变量和局部变量这是自动完成的。但在类成员变量中,我们需要利用其他定义的几个结构体XMFLOAT2(2D),XMFLOAT3 (3D),XMFLOAT4(4D)
去代替。
定义如下:
struct XMFLOAT2
{
float x;
float y;
XMFLOAT2() {}
XMFLOAT2(float _x, float _y) : x(_x), y(_y) {}
explicit XMFLOAT2(_In_reads_(2) const float *pArray):x(pArray[0]), y(pArray[1])
{}
XMFLOAT2& operator= (const XMFLOAT2& Float2)
{ x = Float2.x; y = Float2.y; return *this; }
};
但是,对于这种类型的运算是不会使用SIMD加速的,所以在调用类成员进行计算时,我们需要将其类型转化为XMVECTOR,幸运的是DirectXMath库提供了这样的转换函数。
//FLOAT TO VECTOR
// Loads XMFLOAT2 into XMVECTOR
XMVECTOR XM_CALLCONV XMLoadFloat2(