Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么Doom3会切换列和行主矩阵?_C++_Opengl - Fatal编程技术网

C++ 为什么Doom3会切换列和行主矩阵?

C++ 为什么Doom3会切换列和行主矩阵?,c++,opengl,C++,Opengl,我一直在勇敢地尝试探索末日3的源代码。我偶然发现的一件事是在解决方案的其余部分中使用的矩阵类。这是一个相当简单的代码,但是有一个我还不能理解的决定。他们决定混合不同大小的列和主要行主调 3x3矩阵是列主矩阵 每一个矩阵都是row-major(我想-还没有全部检查) 有人知道为什么会做出这个决定吗?既然OpenGL是column major,我认为只使用column major是有意义的 就像Oli Charlesworth已经评论过的那样,这可能是一个改进缓存行为的决定。OpenGL的矩阵以

我一直在勇敢地尝试探索末日3的源代码。我偶然发现的一件事是在解决方案的其余部分中使用的矩阵类。这是一个相当简单的代码,但是有一个我还不能理解的决定。他们决定混合不同大小的列和主要行主调

  • 3x3矩阵是列主矩阵
  • 每一个矩阵都是row-major(我想-还没有全部检查)

有人知道为什么会做出这个决定吗?既然OpenGL是column major,我认为只使用column major是有意义的

就像Oli Charlesworth已经评论过的那样,这可能是一个改进缓存行为的决定。OpenGL的矩阵以列为主,因为在客户端,您对列比对行更感兴趣(列构成坐标系的基础)。然而,如果矩阵用于物理或碰撞检测等计算,则许多操作将是主要的。因此,这在很大程度上取决于主要对所讨论的矩阵执行的操作类型。Doom3引擎大量使用内存,因此选择正确的内存布局对整体性能有很大影响,在矩阵多数之间进行简单切换可能会添加/删除大量涉及的操作。

我只能猜测:

如果我没记错的话,转换矩阵(3x3)是OpenGL最需要的矩阵。由于OpenGL是列主视图,因此保持游戏的内部表示列也是主视图是很有意义的,因此您不必在每次向OpenGL传递3x3矩阵时都进行额外的工作

保持其他矩阵行的主键可能是一个设计决策。也许他们使用了其他已经使用row-major的游戏的代码,或者他们的程序员只是更愿意使用它。 另一种可能性是,它们对其他矩阵执行的许多操作主要使用行而不是列。Row major然后为您提供更好的内存布局和更快的访问时间。 也可能是他们使用的文件格式将矩阵存储为行主键


它有很多“可能是”和“如果”,但至少是一种方法。

我不是图形程序员,但我认为在我所看到的处理二维数组的代码中,row-major更为典型。因此,这可能纯粹是为了可维护性。Row-major/column-major对缓存行为的影响大不相同,这取决于对矩阵执行的操作类型。@doug Row major在C中是自然的。column major在Fortran中是自然的。这可能是因为有多人在引擎上工作。这可能取决于矩阵的实际使用情况。如果矩阵用于使用OpenGL的图形部分,那么列主顺序就是一种方法。但是,对于不同的用途,行主顺序可能更好。