OpenGL四次渲染优化
我在openGL中绘制四边形。我的问题是,是否有任何与此额外的性能增益:OpenGL四次渲染优化
// Method #1
glBegin(GL_QUADS);
// Define vertices for 10 quads
glEnd();
...在这样每个10个四边形:
// Method #2
glBegin(GL_QUADS);
// Define vertices for first quad
glEnd();
glBegin(GL_QUADS);
// Define vertices for second quad
glEnd();
//etc...
所有四边形使用相同的纹理在此案件。
我决定继续并使用10,000个四元组的循环进行基准测试。
结果:
方法1:0.0128秒
方法2:0.0132秒
方法#1确实有一定的改善,但这种改善是很边缘(3%)。这可能只不过是简单地调用更多函数的开销。所以很可能OpenGL本身没有从方法1中获得任何额外的优化。
这是使用OpenGL 2.0的Windows XP Service Pack 3和Visual Studio 2005的
我相信答案是肯定的,但你应该自己尝试一下。写一些东西来绘制100k的四边形,看看是否更快。然后在这里报告你的结果:)
schnaader:你读的文档中的含义是你不应该在glBegin和glEnd之间有非gl相关的代码。它们并不意味着你应该多次调用它,而是通过简短的位来调用它。
感谢您的回答,我的结果发布在下面的答案:) – 2009-07-12 18:24:57
我想通过重新使用顶点可以获得最高的性能增益。为了达到这个目的,你需要自己维护一些基元的结构。
是的,第一个更快,因为每次调用glBegin
或glEnd
都会改变OpenGL状态。
更妙的是,然而,比一个调用glBegin
和glEnd
(如果你有顶点的显著数),是通过所有的顶点与glVertexPointer(朋友),然后打一个电话,到glDrawArrays或glDrawElements 。这将一举将所有顶点发送到GPU,而不是通过反复调用glVertex3f
递增。
从函数调用开销的角度来看,第二种方法更加昂贵。如果不是十个四元组,我们使用了一万个。然后,glBegin/glEnd将被称为每帧一万次而不是一次。
更重要的是,从OpenGL 3.0开始,glBegin/glEnd已被弃用,OpenGL ES不支持。
而是使用诸如glDrawArrays之类的调用将顶点上载为顶点数组。教程和更深入的信息可以在NeHe site上找到。
你会得到更好的性能一定能在到底有多少代码被由CPU调用。
无论您的绘图性能在GPU上是否会更好,这完全取决于您的3D图形卡驱动程序的实现。使用不同制造商的驱动程序,甚至是同一张卡的不同版本的驱动程序,您可能会得到潜在的大不相同的结果。
您是如何基准测试的?对OpenGL调用进行基准测试非常困难 - 只需在调用之前和之后设置计时器,并不一定会考虑将数据发送到GPU,GPU上的任何计算以及渲染。 – 2009-07-13 03:53:54