c++ - XMMATRIX 对 2D 转换是否有效,或者我应该制作自定义 3x3 矩阵套件?

标签 c++ matrix transformation direct3d directxmath

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

我需要对可视化树中的二维元素进行矩阵变换,我想知道使用 DirextXMath 的内置(SIMD 优化)XMMATRIX 及其相关函数对于二维使用是否有效(如只需要一个 3x3 矩阵,而 XMMATRIX 等是 4x4),或者我是否应该推出自己的矩阵类/函数(虽然可能没有任何 SIMD 特定代码)。

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


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

最佳答案

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

也就是说,许多现代编译器现在自动矢量化,因此您用普通 C++ 编写的自定义类可能最终会在幕后进行 SSE 优化。

无论哪种方式,如果您尚未针对缓存行为优化引擎,您可能看不到任何性能差异。例如,如果您的引擎使用指针表示层次结构,并且您只是在需要时在堆上分配新元素,那么在等待内存(无论是否为 SSE)时,您将破坏缓存并有足够的时间来计算转换。

关于c++ - XMMATRIX 对 2D 转换是否有效,或者我应该制作自定义 3x3 矩阵套件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26141708/

相关文章:

c++ - 静态构建 Qt 5.1

c++ - 自定义字典类 C++ 中的段错误

image - Chrome 中的高质量图像渲染

c# - Entity Framework 6 保留 MathNet.Numerics 矩阵

使用链表的 C++ 堆栈

algorithm - 矩阵的每一行和每一列恰好有一个值

javascript - 网页上的 3D 透视文本

javascript - 应用所有变换矩阵

python - 反向 Box-Cox 变换

c++ - C:C 中的 volatile 数组