首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DirectXMath和D3DXMath

使用DirectXMath和D3DXMath
EN

Stack Overflow用户
提问于 2017-11-21 09:16:40
回答 1查看 1.5K关注 0票数 0

在D3DXMath中,我们有能力乘、加、减甚至除法向量类型,即D3DXVECTOR2、D3DXVECTOR3、D3DXVECTOR4结构……现在在DirectXMath中我们有XMFLOAT2,XMFLOAT3,XMFLOAT4和XMVECTOR。如果我想做任何数学操作,我必须执行从XMFLOAT到XMVECTOR的转换,无论哪种方式,Visual都会抛出一个错误“没有用户定义的转换”。那是为什么?事实上,在DirectX数学库的新版本(Windows8.1,10)中,向量操作略有改变。我是不是做错了什么.?!

对于矩阵,还有另外一个问题,但现在我们只讨论向量。这些变化促使第三方开发人员创建自己的数学库,他们已经这样做了……:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-28 23:46:02

这实际上在MSDN上的DirectXMath程序员指南中有详细的解释:

XMVECTOR和XMMATRIX类型是DirectXMath库的工作马。每个操作都消耗或生成这些类型的数据。使用它们是使用库的关键。但是,由于DirectXMath使用SIMD指令集,这些数据类型受到许多限制。如果要充分利用DirectXMath函数,了解这些限制是至关重要的。 您应该认为XMVECTOR是SIMD硬件寄存器的代理,XMMATRIX是四个SIMD硬件寄存器的逻辑分组的代理。对这些类型进行注释,以表明它们需要16字节对齐才能正确工作。当它们作为局部变量使用时,编译器将自动将它们正确地放置在堆栈中,或者当它们作为全局变量使用时,将它们放在数据段中。有了适当的约定,它们也可以作为参数安全地传递给函数(有关详细信息,请参阅调用约定)。 然而,来自堆的分配要复杂得多。因此,当您使用XMVECTOR或XMMATRIX作为要从堆中分配的类或结构的成员时,您需要小心。在x64上,所有堆分配都是16字节对齐的,但是对于x86,它们只有8字节对齐.有一些选项可以使用16字节对齐方式从堆中分配结构(请参阅正确地对齐分配)。对于C++程序,您可以使用运算符new/delete/new[]/delete[]重载(无论是全局的还是特定于类的)来执行最佳对齐(如果需要的话)。 但是,避免在类或结构中直接使用XMVECTOR或XMMATRIX通常更容易和更紧凑。相反,使用XMFLOAT3、XMFLOAT4、XMFLOAT4X3、XMFLOAT4X4等作为您的结构的成员。此外,您可以使用向量加载和向量存储函数将数据有效地移动到XMVECTOR或XMMATRIX局部变量中,执行计算,并存储结果。也有流函数(XMVector3TransformStream、XMVector4TransformStream等)直接对这些数据类型的数组进行操作。

通过设计,DirectXMath鼓励您编写高效、SIMD友好的代码.加载或存储向量是昂贵的,因此您应该尝试在一个“流”模型中加载数据,大量使用它,然后编写结果。

尽管如此,我完全理解这个用法对于刚接触SIMD数学或DirectX的人来说有点复杂,甚至对于专业的开发人员来说也有点冗长。这就是为什么我还为SimpleMath编写了DirectXMath包装器,这使得它更像您正在寻找的使用XNA的经典数学库,比如Vector2Vector3、带有“C++魔术”的Matrix类,掩盖了所有的显式加载和存储。SimpleMath类型与DirectXMath巧妙地互操作,因此您可以随意混合和匹配。

参见这篇博客文章GitHub

DirectXMath是一个“内联”库,意思是在优化的代码中,您不应该过多地传递变量,而应该只计算更大的函数中的值。D3DXMath库在已弃用 D3DX9D3DX10D3DX11库中更为古老,它依赖于函数指针表,并且性能受到调用约定开销的严重限制。 当然,这代表着不同的工程权衡。D3DXMath能够在运行时对专用处理器代码路径进行更多的替换,但是通过调用约定和间接开销来支付这种灵活性。另一方面,DirectXMath假设SSE/SSE 2(或Xbox One上的AVX )是SIMD基线,因此您避免了运行时检测或间接的需要,而是积极地使用内联。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47409336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档