游戏跨平台:数学库

本文介绍了游戏开发中跨平台数学库GLM的使用,探讨了SIMD(单指令多数据)和SSE2指令集如何加速计算,详细解析了DirectXMath的XMVECTOR结构和XMFLOAT类型。同时,分析了GLM库的文件目录和跨平台代码实现,包括不同平台、编译器和指令集的宏定义,为实现高性能的跨平台游戏开发提供参考。
摘要由CSDN通过智能技术生成

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(常用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值