在OpenGL中,glPushMatrix()和glPopMatrix()的计算成本有多高?
执行在OpenGL中,glPushMatrix()和glPopMatrix()的计算成本有多高?,opengl,Opengl,执行glPushMatrix()和glPopMatrix()时会产生多少开销?例如,如果我的ModelView矩阵是一个简单的转换,我有一个简单的转换,我应该使用反向转换而不先执行glPushMatrix(),还是应该先执行推送,然后执行转换,然后执行弹出?来自固定大小矩阵堆栈的推送/弹出可能比执行另一个转换更快。它在数值上也更稳定;您不必担心反向翻译会完全取消翻译。实际上,这是一个微观优化 尽管我将发布标准警告:OpenGL矩阵API是不推荐使用的固定函数管道的一部分。现在大多数真实的程序实现
glPushMatrix()
和glPopMatrix()
时会产生多少开销?例如,如果我的ModelView矩阵是一个简单的转换,我有一个简单的转换,我应该使用反向转换而不先执行glPushMatrix(),还是应该先执行推送,然后执行转换,然后执行弹出?来自固定大小矩阵堆栈的推送/弹出可能比执行另一个转换更快。它在数值上也更稳定;您不必担心反向翻译会完全取消翻译。实际上,这是一个微观优化
尽管我将发布标准警告:OpenGL矩阵API是不推荐使用的固定函数管道的一部分。现在大多数真实的程序实现自己的矩阵函数(或使用GLM之类的库),然后将生成的矩阵上载到顶点着色器
这样做的好处之一是您知道矩阵运算的性能特征,因为您自己编写了矩阵运算(或者可以访问源代码);GL矩阵函数的性能取决于实现者的突发奇想(在您询问之前:它们不是GPU加速的)。另一个好处是,您自己的矩阵例程是可内联的,并且可由编译器进行优化。除了您已经得到的答案之外,我想补充两件事:
纵观x86和ARM体系结构的最新实现,最重要的变量是可用微体系结构寄存器的数量。带有SSE的x86或带有Neon的ARM已经有足够的可寻址寄存器空间来容纳两个4×4单精度矩阵。但你在“二进制机器代码”中看到的寄存器实际上只是硅中实际寄存器组的句柄(在现代无序执行管道体系结构中),每次你对寄存器执行操作时,微体系结构内部都会执行。因此,机器代码中看似完整的栈顶元素复制操作实际上可能分解为零复制寄存器重命名操作。考虑到涉及浮点数学,应用转换和取消应用不一定会产生原始矩阵作为结果。