in Whisperwind(我的开源游戏项目) , by 李素颙

最近又开始愁数学库的问题了,折腾了一天,总算定了下来,大抵上如下:

一般的开源引擎或是商业引擎基本上的选择都是自己去写,写一个通用库然后按照自己需要支持的平台去针对性优化,如果实力强悍这种方法当然是最好的,易控制好扩展,Ogre,KlayGe,UE等都是这么搞的,但对我这种数学小白来说,显然有点不切实际了,写个简单可用的还行,但真正涉及到每个具体平台的优化那就是扯淡了,太耗时间了,而且还有无数的Bug要修,更而且根本没这个时间。

然后目光瞄准了开源的那帮家伙们,大体上这么几个:

Configurable Math Library(近来更新慢下去了)

Eigen(更新的频繁,但采用的是LGPL)

GLM (openGL社区写的,性能很不错)

XnaMath (取代了之前的D3DXMath,并于Win8中更名为DirectXMath)

还有一些譬如sony的那个数学库,但好久没更新了,以及Bullet的那个,还有Cuda也可以作为数学库,等等…

对了,还有商业的intel的 MKL ,性能超级强悍,而且貌似也不贵,如果不是做开源项目的话绝对是上佳选择啊~

人就是这样,东西多了反而不好选择了, 从性能和更新频率上来说,XnaMath,GLM,Eigen是最好的,从个人感情上来说,GLM是不喜欢的,实在受不了openGL的代码风格,从平台独立性来讲,Eigen强于XnaMath,虽然以后的DirectXMath基本上不会依赖于Windows多少东西,但毕竟微软自家的东西还是只会针对自己支持的平台进行优化的,那么按理来说不是应该选择Eigen的么,为何最终选择了XnaMath呢,大抵上是这么考虑的,虽然Whisperwind会去讲究一定的平台独立性,但其实近几年根本不可能,中国这市场Windows还能独占好些年,除非去国外(当然,这个也是我尽量做到平台无关时隐隐考虑过一些的),也就是说在能考虑时会考虑一下,但不是一定的,尤其是对这种可替换的库,我的需求是最多近一年支持Dx11,所以大抵上用微软的东西还是最放心的,而且以后x64的普及还真得跟着微软走,这个是肯定的,另外就是XnaMath性能很强悍,功能也很完善,这儿有位大牛分析了下:http://www.gamasutra.com/view/feature/132636/designing_fast_crossplatform_simd_.php?page=2 ,而且编码风格上,虽然连namespace都没用(这点在随后的DirectXMath已改正),但总体来说还是比较舒服的,相比之下,Eigen的风格也挺好,而且大量模版编程,很是灵活,更主要的是用Eigen的那些名单上(因为是LGPL,所以作者会知道谁用了,不是天朝,人家都很懂规矩的,License有时就是上帝)没什么游戏相关的,最多一些搞科研的图像引擎用了些,最牛逼的是google的一个什么人工智能项目用到了,但于我无关,而XnaMath天生就是为游戏而生嘛,而且SSE2等的支持也很完善,云云,所以综上,我选择了XnaMath,以后Win8出了还得转向DirectXMath,挺好,望微软一直更新下去吧,别坑爹了…

大体上参考了这些资料,以及gamedev,stackoverflow,和gamedev.stackoverflow上的帖子就不一一列出了:

http://www.mfoot.com/2012/01/choosing-a-maths-library-for-cross-platform-c-game-development/comment-page-1/#comment-1378

http://gamedev.stackexchange.com/questions/9924/best-c-math-library-for-game-engine

http://www.gamasutra.com/view/feature/132636/designing_fast_crossplatform_simd_.php?page=2

BTW,我没提什么细节问题,譬如SIMD的支持啊什么的,是因为这些玩意基本都支持哈,所以无甚提的必要了。

附上刚在人人发的一条感慨:

通用基础层,数学层,引擎架构层,图像层,物理层,场景管理层,脚本层,资源管理层,逻辑结构层,gameplay层,通信层,网络层,服务器层,内容层,UI层,性能控制层,测试层,流程层,发布层,管理层,投资层,商业层,等等等等,最后你死掉了….fuck!