Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Performance Opengl glLoadIdentity()比glPushMatrix()/glPopMatrix()更快?_Performance_Opengl - Fatal编程技术网

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