我一直在勇敢地试图弄清楚厄运3的源代码。我偶然发现的一件事是在整个解决方案中使用的矩阵类。这是一个相当简单的代码,但我做出的决定是我无法理解的。他们决定将Column和Major行专业混合使用不同的尺寸。
有谁知道为什么做出这个决定?由于OpenGL是专栏专业,我认为只使用专业列是有意义的吗?
答案 0 :(得分:10)
就像Oli Charlesworth已经评论过这可能是改善缓存行为的决定。 OpenGL的矩阵是列专业,因为在客户端,你对列比对行更感兴趣(列构成坐标系的基础)。但是,如果矩阵用于物理或碰撞检测等计算,那么很多操作都是行专业。因此,这很大程度上取决于主要在相关矩阵上执行的操作类型。 Doom3引擎大量使用Plücker coordinates,因此选择正确的内存布局会对整体性能产生非常强烈的影响,并且矩阵之间的简单切换可能会增加/删除大量涉及的操作。
答案 1 :(得分:1)
我只能猜测:
如果我没记错的话,转换矩阵(3x3)是OpenGL最需要的矩阵。由于OpenGL是专栏专业,所以保持游戏内部表示专栏也很重要,因此每次想要将3x3矩阵传递给OpenGL时都不需要做额外的工作。
保持其他矩阵排在主要位置可能是一个设计决定。也许他们已经重新使用了已经使用行专业的其他游戏中的代码,或者他们的程序员更习惯使用它。 另一种可能性是,他们在其他矩阵上进行的大量操作主要是使用行而不是列。 Row major会为您提供更好的内存布局和更快的访问时间。 也可能是他们使用的文件格式将矩阵存储为行主要。
很多“可能是”和“如果”,但它至少是一种方法。