这篇文章只是对着MSDN文档的一些吐槽和总结记录,个人笔记之类的

运行库与头文件

老实说,这个数学库微软还是更像蛮频繁的,我这里有的最早版本是伴随DX9的,在这个头文件里面

最近在使用DXUT,顺便也就使用了下这个库,不过没有测试过效率,我不知道怎么测试效率好……

没有升级到Win8.1的时候,用的是XNAMATH.h

现在在用DirectXMath.h,这个可真是对C++程序员口味,用namepsace包起来了,这样要少了很多名字上的污染,没当看到windows.h就有种淡淡的忧伤

这三个头文件里面的内容基本一致,我尝试过不同头文件但是存储同样东西可以转型也不会崩溃什么的,不过最好还是别这样干吧,搞不好出问题了,按理来说是不会

CPU特性检测:

XMVerifyCPUSupport();z这个函数比较有意思,基本上是恒定返回true的,因为现在的CPU基本都支持了,在XNAMTAH.h比较保守,是用宏来做,有对应的宏直接返回true,没有调用API检测

#if
defined(_XM_X86_)
||
defined(_XM_X64_)

#define
_XM_SSE_INTRINSICS_

XMINLINE
BOOL
XMVerifyCPUSupport()

{

#if
defined(_XM_NO_INTRINSICS_)
||
!defined(_XM_SSE_INTRINSICS_)

    return TRUE;

#else
// _XM_SSE_INTRINSICS_

    // Note that on Windows 2000 or older, SSE2 detection is not supported so this will always fail

    // Detecting SSE2 on older versions of Windows would require using cpuid directly

    return
(
IsProcessorFeaturePresent(
PF_XMMI_INSTRUCTIONS_AVAILABLE
)
&&
IsProcessorFeaturePresent(
PF_XMMI64_INSTRUCTIONS_AVAILABLE
)
);

#endif

}

到了DirectXMath.h,直接就是检测宏存不存在了,这个函数也就是个保留意义,兼容之前写的代码吧(最新的版本[3.06],我机子上这个8.0版本[3.02]还是有特性检测的)

http://msdn.microsoft.com/en-us/library/windows/desktop/hh855941(v=vs.85).aspx

使用这东西有对齐要求,在栈上能正确工作,在类或结构体里面,这类或结构体会出现分配到堆上的时候,就得注意了,x64不需要注意,16对齐的,但是x86是8对齐的,也许你需要重载对应的new,delete恩,你懂的,当然还有个pImpl手法,具体我也不懂,反正微软如此介绍,

代码优化注意事项和策略

  1. 减少单个数据读取,MSDN上说,读取单个数据要从SIMD寄存器转成标量的(单精度浮点数) 读之后还要回退操作(moving from the SIMD registers to the scalar ones and back again.)
  2. 使用正确的编译指令和最新的编译器…..X86使用/arch:SSE2,所有的WindowsTarget均允许/fp:fast(这个库的函数全部是内联SSE2指令的,但只是对于这个库来讲,超出DirectXMath的代码,不具备这点)
  3. 使用估算函数,带Est后缀的版本,实际上我用不带的,误差累积,个人觉得略大
  4. 使用对齐的数据类型和操作(因为库的实现有两种实现),对齐的带A后缀,比如XMFLOAT4X4A,对齐的比不对的快
  5. 内存对齐分配,栈上的数据对齐编译器保证,但是堆里面你new出来的数据就不一定了.64位Windows没有此烦恼,(我目测我得转移测试我的渣代码),X86请参考_aligned_malloc
  6. 注意,在STL中使用这些类型,请提供自定义的Allocator, See the Visual C++ Team blog,注意有些STL会修改对齐,如 make_shared<>
  7. 避免操作符重载,这个就是C++复制几百份的笑话了. XMVECTOR and XMMATRIX have operator overloads    
  8. 非规格数,x86遗留的蛋疼玩意….. _controlfp_s( &control_word, _DN_FLUSH, _MCW_DN );
  9. Take Advantage of the Integer Floating Point Duality ,这个吗,注意一下特殊值,记到脑袋里面去

    SIGN EXPONENT MANTISSA

    X XXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX

    1 bit 8 bits 23 bits

    •Positive zero is 0

    •Negative zero is 0x80000000

    •Q_NAN is 07FC0000

    •+INF is 0x7F800000

    •-INF is 0xFF800000

  10. Using DirectXMath with Direct3D 按理认为正确的那样用就行了,注意下矩阵,使用/Zpr编译可能会导致传到HLSL的矩阵被翻转了

     

     

     

传递参数的,自己去看MSDN吧,这个地方东西很多,下面贴几个例子就好

XMMATRIX XM_CALLCONV XMMatrixLookAtLH(FXMVECTOR EyePosition, FXMVECTOR FocusPosition, FXMVECTOR UpDirection);

 

XMMATRIX XM_CALLCONV XMMatrixTransformation2D(FXMVECTOR ScalingOrigin, float ScalingOrientation, FXMVECTOR Scaling, FXMVECTOR RotationOrigin, float Rotation, GXMVECTOR Translation);

 

void XM_CALLCONV XMVectorSinCos(XMVECTOR* pSin, XMVECTOR* pCos, FXMVECTOR V);

 

XMVECTOR XM_CALLCONV XMVectorHermiteV(FXMVECTOR Position0, FXMVECTOR Tangent0, FXMVECTOR Position1, GXMVECTOR Tangent1, HXMVECTOR T);

 

XMMATRIX(FXMVECTOR R0, FXMVECTOR R1, FXMVECTOR R2, CXMVECTOR R3)

 

XMVECTOR XM_CALLCONV XMVector2Transform(FXMVECTOR V, FXMMATRIX M);

 

XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose(FXMMATRIX M1, CXMMATRIX M2);

注意的是,传到SSE2寄存器里面,一定是以值来传递的

32bit:

 

    __fastcall 传递前三个到寄存器里面(从左至右)

    __vectorcall 传递前六个到寄存器里面

64bit:

    __fastcall 通过栈,意思是叫你传递引用

    __vectorcall同上的__vectorcall

http://msdn.microsoft.com/en-us/library/windows/desktop/ee418728(v=vs.85).aspx

 

微软数学库XNAMATH(DirectXMath)的更多相关文章

  1. DX11 Without DirectX SDK--06 DirectXMath数学库

    回到 DirectX11--使用Windows SDK来进行开发 xnamath.h原本是位于DirectX SDK的一个数学库,但是现在Windows SDK包含的数学库已经抛弃掉原来的xnamat ...

  2. DirectX11 With Windows SDK--06 DirectXMath数学库

    前言 xnamath.h原本是位于DirectX SDK的一个数学库,但是现在Windows SDK包含的数学库已经抛弃掉原来的xnamath.h,并演变成了现在的DirectXMath.h.其实本质 ...

  3. XNA数学库

    XNA Math Vectors 在direct3D 9 和10中,包含3D数学库的D3DX库支持向量和其他核心类型的计算.在direct11中,D3DX库不在包含3D数学库,取而代之的是XNA数学库 ...

  4. DirectX11 学习笔记6 - 使用D3DXMATH数学库的一个样例

    这个样例是在之前的样例基础上 .把之前d3dx10math数学库换成了最新的d3dxmath.长处就不说了.先上效果图 所有代码.以及效果文件 文件结构 所有代码: 依照上图的文件顺序 #pragma ...

  5. 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持

    在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreS ...

  6. 【公开课】《奥威Power-BI基于微软示例库(MSSQL)快速制作管理驾驶舱》文字记录与反馈

        本期分享的内容: <奥威Power-BI基于微软示例库(MSSQL)快速制作管理驾驶舱> 时间:2016年11月02日 课程主讲人:叶锡文 从事商业智能行业,有丰富的实施经验,擅长 ...

  7. 10月26日 奥威Power-BI基于微软示例库(MSOLAP)快速制作管理驾驶舱 腾讯课堂开课啦

    本次课是基于olap数据源的案例实操课,以微软olap示例库Adventure Works为数据基础.        AdventureWorks示例数据库为一家虚拟公司的数据,公司背景为大型跨国生产 ...

  8. 微软企业库5.0学习-Security.Cryptography模块

    一.微软企业库加密应用模块提供了两种加密: 1.Hash providers :离散加密,即数据加密后无法解密 2.Symmetric Cryptography Providers:密钥(对称)加密法 ...

  9. [EntLib]微软企业库5.0 学习之路——第一步、基本入门

    话说在大学的时候帮老师做项目的时候就已经接触过企业库了但是当初一直没明白为什么要用这个,只觉得好麻烦啊,竟然有那么多的乱七八糟的配置(原来我不知道有配置工具可以进行配置,请原谅我的小白). 直到去年在 ...

随机推荐

  1. windows下安装和配置Weka

    Weka是一款免费的,非商业化的,基于java环境下的开源的机器学习以及数据挖掘软件.Weka里含有各种数据挖掘工具:数据预处理,分类与回归,聚类,关联规则和可视化工具. 一.安装weka 我们首先需 ...

  2. KVM背靠Linux好乘凉

    虚拟化是走向云的第一步,同理,开源虚拟化是走向开源云的第一步.云计算所提供的产品与方案都是围绕着IT资源的新交付与消费模式.云的形式多样,私有云.公有云与混合云,无论哪种云都具有三个关键特征:虚拟化. ...

  3. Protocol Buffers编码详解,例子,图解

    Protocol Buffers编码详解,例子,图解 本文不是让你掌握protobuf的使用,而是以超级细致的例子的方式分析protobuf的编码设计.通过此文你可以了解protobuf的数据压缩能力 ...

  4. HDU 5781 ATM Mechine (概率DP)

    ATM Mechine 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5781 Description Alice is going to take ...

  5. sping配置文件中引入properties文件方式

    <!-- 用于引入 jdbc有配置文件参数 可以使用PropertyPlaceholderConfigurer 或者PropertyOverrideConfigurer --> <b ...

  6. Quality Center11初始化失败

    打开start_a.jsp页面总是闪退,原因如下: 初始化失败因为证书签名过期了.把IE选项里证书检查的三项勾掉就好了(检查发行商的证书是否吊销.检查服务器证书吊销.检查已下载的程序的签名)

  7. Nginx 禁止IP访问

    我们在使用的时候会遇到很多的恶意IP攻击,这个时候就要用到Nginx 禁止IP访问了.下面我们就先看看Nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了 ...

  8. Codeforces Round #271 (Div. 2) F. Ant colony (RMQ or 线段树)

    题目链接:http://codeforces.com/contest/474/problem/F 题意简而言之就是问你区间l到r之间有多少个数能整除区间内除了这个数的其他的数,然后区间长度减去数的个数 ...

  9. HDU 1150 Machine Schedule (二分图最小点覆盖)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1150 有两个机器a和b,分别有n个模式和m个模式.下面有k个任务,每个任务需要a的一个模式或者b的一个 ...

  10. Caused by: Cannot locate the chosen ObjectFactory implementation: spring - [unknown location] 的解决方式

    1.添加网上所说的struts2 plugin jar包 2. <!-- Struts2配置 --> <filter> <filter-name>struts2&l ...