Performance Opengl glLoadIdentity()比glPushMatrix()/glPopMatrix()更快?
我做一个粒子发射器。我不需要在转换中管理父/子层次结构 最快的是什么Performance Opengl glLoadIdentity()比glPushMatrix()/glPopMatrix()更快?,performance,opengl,Performance,Opengl,我做一个粒子发射器。我不需要在转换中管理父/子层次结构 最快的是什么 glPushMatrix() ..apply tranformations ...draw object glPopMatrix() 或 我的每一个微粒 我在我的程序中尝试了这两种技术,但在FPS中没有看到任何区别。少数变体可能来自我电脑上的其他程序,如防病毒。我想两者都不是。如果在渲染粒子系统时,粒子数量可能是性能问题,则为每个粒子发送变换(这意味着为每个粒子发出单独的渲染调用)将扼杀任何性能希望 如果需要
glPushMatrix()
..apply tranformations
...draw object
glPopMatrix()
或
我的每一个微粒
我在我的程序中尝试了这两种技术,但在FPS中没有看到任何区别。少数变体可能来自我电脑上的其他程序,如防病毒。我想两者都不是。如果在渲染粒子系统时,粒子数量可能是性能问题,则为每个粒子发送变换(这意味着为每个粒子发出单独的渲染调用)将扼杀任何性能希望
如果需要粒子系统,最好的办法是将所有粒子放在一个数组中,并在一次调用中进行渲染。两者都不需要。如果在渲染粒子系统时,粒子数量可能是性能问题,则为每个粒子发送变换(这意味着为每个粒子发出单独的渲染调用)将扼杀任何性能希望 如果您想要一个粒子系统,最好的办法是将所有粒子放入一个数组中,并在一次调用中进行渲染。我想补充一点,glPush/glPop与glIdentity不同 glPush保存矩阵堆栈的当前顶部,glPop恢复该状态 glIdentity清除矩阵堆栈的当前顶部 您的设计存在几个问题: 这个功能在现代OpenGL中已被弃用,因此最好使用其他功能来处理矩阵。例如GLM 如果你对每一个粒子都这样做,那么它将是应用程序的巨大性能瓶颈! 对于粒子更新/渲染,最好: 计算循环中粒子的最终/世界位置并将这些位置保存到缓冲区,例如使用VBO 使用上一个缓冲区渲染点。这样,您可以使用一个绘制调用+设置的几行来绘制大量的点。 这里有一个很好的链接:我想补充一点,glPush/glPop与glIdentity不同 glPush保存矩阵堆栈的当前顶部,glPop恢复该状态 glIdentity清除矩阵堆栈的当前顶部 您的设计存在几个问题: 这个功能在现代OpenGL中已被弃用,因此最好使用其他功能来处理矩阵。例如GLM 如果你对每一个粒子都这样做,那么它将是应用程序的巨大性能瓶颈! 对于粒子更新/渲染,最好: 计算循环中粒子的最终/世界位置并将这些位置保存到缓冲区,例如使用VBO 使用上一个缓冲区渲染点。这样,您可以使用一个绘制调用+设置的几行来绘制大量的点。
这里有一个很好的链接:它们做了不同的事情,值得做什么。在没有push/pop的情况下加载标识意味着您没有真正跟踪嵌套状态。也许你所做的一切都没问题,但你通常会想推,加载标识,然后在完成序列后弹出。这些做不同的事情,为了它的价值。在没有push/pop的情况下加载标识意味着您没有真正跟踪嵌套状态。也许你所做的一切都没问题,但你通常会想推,加载标识,然后在序列完成时弹出。为OP澄清+1,它不是每个粒子的变换本身,而是对每个杀死你的粒子发出单独的绘制调用。这是一个非常有趣的答案。我现在不接受你的回答,因为它没有回答这个主题的问题。但这就是我问题的答案。谢谢。不过如果你想显示按距离相机的距离排序的粒子,我不认为你可以使用缓冲区对象。顺序会不断变化。@mrstack:它们的位置和方向也会不断变化。订单有什么不同?不管是哪种方式,您都在谈论缓冲区流。@mrstack:理论上,glLoadIdentity可以比glPushMatrix/glPopMatrix快或慢,这取决于它的实现方式。实际上,它没有可测量的区别,因为像这样的操作不会立即执行,而是排队进入一个长的状态转移向量,只有在它真正重要的时候才会应用到光栅化器上,它会对每一个杀死你的人分别进行抽签。这是一个非常有趣的答案。我现在不接受你的回答,因为它没有回答这个主题的问题。但这就是我问题的答案。谢谢。不过如果你想显示按距离相机的距离排序的粒子,我不认为你可以使用缓冲区对象。顺序会不断变化。@mrstack:它们的位置和方向也会不断变化。订单有什么不同?您说的是缓冲区流式传输。@mrstack:glLoadIdentity理论上可以是 比glPushMatrix/glPopMatrix快或慢取决于其实现方式。实际上,这并没有造成可测量的差异,因为像这样的操作不会立即执行,而是排队进入一个长的状态转移向量,只有在它真正起作用之前,get才会应用到光栅化器。
glLoadIdentity()
..apply tranformations
...draw object