玩具3D矩阵库

0x01

为了给之后的毕设铺路,我花了小半个月写了一个SIMD加速的3D矩阵库。
我给它起名叫--- FoxMath

狐狸是种可爱的小动物啊(●'◡'●)

仓库的地址
代码量不大,但是学SIMD那些Intrinsic花了我老大劲了

吐槽以下intel manual上全是文字太抽象了,加张图很费事么(¬_¬ )


0x02

这个库包含了我个人的最佳实践(所以有很多不合理之处qwq
我把它设计成了编译成静态库的形式,用户不必在使用时关心内部到底用的是哪个指令集,更不用考虑实现(同时也方便未来修改)
用户只需要一个头文件,一个编译好的库,定义一下向量主元素是float32还是float64即可。

0x03

在写的时候学了一点点点DirectXMath...嗯...那一堆calling convention就是学它的 (但事实上X64的calling convention已经统一了,DirectXMath搞那些也有点奇怪..为了提高x86下性能么..

其实当初还看了好久的Eigen和GLM,后来发现没什么必要

首先,Eigen真正发光发热的区域应该是大矩阵计算、约束求解、数值分析...那么一大堆的模板黑科技都是为了保证在不同大小、维度的矩阵、向量下都能有着同样的零抽象开销 -- 把运行时的工作放到编译期完成(奇异模板递归,静态分发),以及尽可能的延后计算减少内存访问。

但是--大哥,我总共就仨类的需求,vec3,vec4,mat4。什么运行时开销,抽象成本,我™直接写死。至于减少内存访问那更没说了,我矩阵最大也就4 *4 *8,俩CacheLine嘛,基本也就是随定义随用,不乱倒腾矩阵,访存压力小的一。

GLM也大量使用模板,我粗略看了下,大概是为了满足shader中不同浮点精度以及好多种矩阵向量的排列组合而做(情况确实太多了
但我需求小,不用考虑那么多情况(GLM,爬

至于Cuda...那点小矩阵用不着在显存和内存之间倒腾

于是DirectXMath成了我眼中最务实的那位OvO

顺带一提,DxMath性能肯定比我的那个好,因为人家Head only而且全员 __forceinline(还有无数的程序员想办法优化......
我的先不论实现方法优劣,首先就多了一层函数调用开销..哭








0x04

啊啊啊啊啊啊啊啊啊啊我的星空,还有三个月发售,太想玩了
来一首星空组曲解解馋

LSO哇,世界顶级交响乐团了
这首貌似是在老滚音乐会结尾演奏的

这首让我有种目睹阿波罗探月的感觉...
这游戏实机里那些机器飞船仿佛是从JPL里运出来的,“NASA Punk”确实戳我。
期待下半年贝社能呈现一部精彩的硬科幻RPG

END