Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
在OpenGL中,glPushMatrix()和glPopMatrix()的计算成本有多高?_Opengl - Fatal编程技术网

在OpenGL中,glPushMatrix()和glPopMatrix()的计算成本有多高?

在OpenGL中,glPushMatrix()和glPopMatrix()的计算成本有多高?,opengl,Opengl,执行glPushMatrix()和glPopMatrix()时会产生多少开销?例如,如果我的ModelView矩阵是一个简单的转换,我有一个简单的转换,我应该使用反向转换而不先执行glPushMatrix(),还是应该先执行推送,然后执行转换,然后执行弹出?来自固定大小矩阵堆栈的推送/弹出可能比执行另一个转换更快。它在数值上也更稳定;您不必担心反向翻译会完全取消翻译。实际上,这是一个微观优化 尽管我将发布标准警告:OpenGL矩阵API是不推荐使用的固定函数管道的一部分。现在大多数真实的程序实现

执行
glPushMatrix()
glPopMatrix()
时会产生多少开销?例如,如果我的ModelView矩阵是一个简单的转换,我有一个简单的转换,我应该使用反向转换而不先执行glPushMatrix(),还是应该先执行推送,然后执行转换,然后执行弹出?

来自固定大小矩阵堆栈的推送/弹出可能比执行另一个转换更快。它在数值上也更稳定;您不必担心反向翻译会完全取消翻译。实际上,这是一个微观优化

尽管我将发布标准警告:OpenGL矩阵API是不推荐使用的固定函数管道的一部分。现在大多数真实的程序实现自己的矩阵函数(或使用GLM之类的库),然后将生成的矩阵上载到顶点着色器


这样做的好处之一是您知道矩阵运算的性能特征,因为您自己编写了矩阵运算(或者可以访问源代码);GL矩阵函数的性能取决于实现者的突发奇想(在您询问之前:它们不是GPU加速的)。另一个好处是,您自己的矩阵例程是可内联的,并且可由编译器进行优化。

除了您已经得到的答案之外,我想补充两件事:

  • OpenGL矩阵堆栈已过时(它已从OpenGL-3.3核心中完全删除)

  • 堆栈推送的成本取决于底层体系结构,但始终是最顶层元素的副本的上限。用于所有目的和目的的堆栈pop操作的成本为零。OpenGL本身只是一个规范,因此它很可能运行在针对堆栈操作进行优化的体系结构上,并且推送操作的成本(接近)为零(例如,通过实现为写时拷贝)

  • 因此,需要注意的一件重要事情是,整个OpenGL矩阵堆栈从未在GPU端实现过(除了一个显著的例外:SGI Onyx图形工作站,但这使得图形处理器与老式CPU的整体区别非常模糊,因为“图形引擎”其中的主板是一组特殊用途的光栅化处理器和常规CPU的混合体


    纵观x86和ARM体系结构的最新实现,最重要的变量是可用微体系结构寄存器的数量。带有SSE的x86或带有Neon的ARM已经有足够的可寻址寄存器空间来容纳两个4×4单精度矩阵。但你在“二进制机器代码”中看到的寄存器实际上只是硅中实际寄存器组的句柄(在现代无序执行管道体系结构中),每次你对寄存器执行操作时,微体系结构内部都会执行。因此,机器代码中看似完整的栈顶元素复制操作实际上可能分解为零复制寄存器重命名操作。

    考虑到涉及浮点数学,应用转换和取消应用不一定会产生原始矩阵作为结果。