C++ XMMATRIX对二维变换有效吗?还是我应该定制一个3x3矩阵套件?

C++ XMMATRIX对二维变换有效吗?还是我应该定制一个3x3矩阵套件?,c++,matrix,transformation,direct3d,directxmath,C++,Matrix,Transformation,Direct3d,Directxmath,我正在Direct3D 11上构建一个高性能的UI布局引擎。该应用程序是使用Visual Studio 2013开发的,目标是x64,适用于Windows 7(具有平台更新)及更高版本 我需要对可视化树中的2D元素进行矩阵变换,我想知道使用DirextXMath的内置(SIMD优化)XMMATRIX及其相关函数是否对2D使用有效(因为这只需要3x3矩阵,而XMMATRIX等是4x4矩阵),或者我是否应该使用自己的矩阵类/函数(不过可能没有任何SIMD特定的代码) 在我看来,整个4x4矩阵意味着要

我正在Direct3D 11上构建一个高性能的UI布局引擎。该应用程序是使用Visual Studio 2013开发的,目标是x64,适用于Windows 7(具有平台更新)及更高版本

我需要对可视化树中的2D元素进行矩阵变换,我想知道使用DirextXMath的内置(SIMD优化)
XMMATRIX
及其相关函数是否对2D使用有效(因为这只需要3x3矩阵,而
XMMATRIX
等是4x4矩阵),或者我是否应该使用自己的矩阵类/函数(不过可能没有任何SIMD特定的代码)

在我看来,整个4x4矩阵意味着要执行大量冗余计算,但与非SIMD 3x3矩阵工作相比,SIMD指令可能会抵消这一点



编辑:关于“过早优化是万恶之源”(及其衍生物)的评论在这里是多余的(讽刺的是过早的,因为你对项目或我一无所知)。这个问题总结了我感兴趣的关于/了解更多信息的一些观点。

布局引擎往往有很多链式转换,因此在SSE寄存器中使用(并在链式转换期间保留)数据可能会提高性能(甚至比通常只有少量链式转换的典型游戏场景更重要)。如果您特别不打算在自定义类中使用SSE,则
XMMATRIX
可能会更快。列的差异其实并不重要,因为每行都适合SSE寄存器,但行的差异将意味着额外的负载。尽管如此,SSE的好处可能还是值得的

这是说,现在很多现代编译器都自动矢量化,所以你在香草C++中编写的自定义类可能最终会使SSE在幕后得到优化。


无论哪种方式,如果您尚未针对缓存行为优化引擎,您可能不会看到性能上的任何差异。例如,如果您的引擎使用指针表示层次结构,并且只要在需要时在堆上分配新元素,您就可以对缓存进行重击,并有足够的时间计算转换在您等待内存的过程中进行修改,不管是否使用SSE。

为什么不从4x4开始,看看它是否会造成瓶颈,然后如果它是性能分析中最重要的问题,则重写它?优化规则1:不要这样做。优化规则2(仅限专家!)不要这样做…但是。4x4矩阵乘法在AAA游戏中并不是一个瓶颈,它可以处理由很多很多三角形组成的很多很多对象。我认为可以安全地假设你会做得很好。事实上,如果你的手动矩阵运算不如库中的矩阵运算效率,我不会感到惊讶。那些游戏正在执行3D转换格式化,所以他们需要一个4x4矩阵。因为我在做2D变换,所以我用3x3矩阵。3x3矩阵乘法涉及27个内部乘法。4x4矩阵涉及64个。这是两倍多。在任何情况下,我对解决这个问题的概念和原则感兴趣,就像“做得很好”一样.如果一种方法比另一种好,就没有什么“不成熟”的关于从一开始就使用一个而不是另一个。通过
NEON
SSE/AVX
可以更容易地优化4x4矩阵。对于代码可能运行的几乎所有CPU架构,它的对齐方式和大小都非常好。@d7samurai除了JustSid所写的,这些k乘法可以映射到完全不同的ins性能行为非常不同的构造序列。内存布局、矢量化、数据依赖性等都是优化4x4乘法在性能上可能与简单3x3乘法竞争的原因。此外,我不同意您对“过早”的解释;如果它从来没有带来任何有形的好处,那么任何额外的努力都是不成熟和浪费的。