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

时间:2011-12-21 16:10:11

标签: c++ opengl

我一直在勇敢地试图弄清楚厄运3的源代码。我偶然发现的一件事是在整个解决方案中使用的矩阵类。这是一个相当简单的代码,但我做出的决定是我无法理解的。他们决定将Column和Major行专业混合使用不同的尺寸。

  • 3x3矩阵是专栏
  • 每个其他矩阵都是行专业(我认为 - 还没有全部检查过)

有谁知道为什么做出这个决定?由于OpenGL是专栏专业,我认为只使用专业列是有意义的吗?

2 个答案:

答案 0 :(得分:10)

就像Oli Charlesworth已经评论过这可能是改善缓存行为的决定。 OpenGL的矩阵是列专业,因为在客户端,你对列比对行更感兴趣(列构成坐标系的基础)。但是,如果矩阵用于物理或碰撞检测等计算,那么很多操作都是行专业。因此,这很大程度上取决于主要在相关矩阵上执行的操作类型。 Doom3引擎大量使用Plücker coordinates,因此选择正确的内存布局会对整体性能产生非常强烈的影响,并且矩阵之间的简单切换可能会增加/删除大量涉及的操作。

答案 1 :(得分:1)

我只能猜测:

如果我没记错的话,转换矩阵(3x3)是OpenGL最需要的矩阵。由于OpenGL是专栏专业,所以保持游戏内部表示专栏也很重要,因此每次想要将3x3矩阵传递给OpenGL时都不需要做额外的工作。

保持其他矩阵排在主要位置可能是一个设计决定。也许他们已经重新使用了已经使用行专业的其他游戏中的代码,或者他们的程序员更习惯使用它。 另一种可能性是,他们在其他矩阵上进行的大量操作主要是使用行而不是列。 Row major会为您提供更好的内存布局和更快的访问时间。 也可能是他们使用的文件格式将矩阵存储为行主要。

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