2009-07-12 201 views
3

我在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... 

所有四边形使用相同的纹理在此案件。

回答

3

我决定继续并使用10,000个四元组的循环进行基准测试。

结果:

方法1:0.0128秒

方法2:0.0132秒

方法#1确实有一定的改善,但这种改善是很边缘(3%)。这可能只不过是简单地调用更多函数的开销。所以很可能OpenGL本身没有从方法1中获得任何额外的优化。

这是使用OpenGL 2.0的Windows XP Service Pack 3和Visual Studio 2005的

+0

您是如何基准测试的?对OpenGL调用进行基准测试非常困难 - 只需在调用之前和之后设置计时器,并不一定会考虑将数据发送到GPU,GPU上的任何计算以及渲染。 – 2009-07-13 03:53:54

2

我相信答案是肯定的,但你应该自己尝试一下。写一些东西来绘制100k的四边形,看看是否更快。然后在这里报告你的结果:)

schnaader:你读的文档中的含义是你不应该在glBegin和glEnd之间有非gl相关的代码。它们并不意味着你应该多次调用它,而是通过简短的位来调用它。

+0

感谢您的回答,我的结果发布在下面的答案:) – 2009-07-12 18:24:57

0

我想通过重新使用顶点可以获得最高的性能增益。为了达到这个目的,你需要自己维护一些基元的结构。

9

是的,第一个更快,因为每次调用glBeginglEnd都会改变OpenGL状态。

更妙的是,然而,比一个调用glBeginglEnd(如果你有顶点的显著数),是通过所有的顶点与glVertexPointer(朋友),然后打一个电话,到glDrawArraysglDrawElements 。这将一举将所有顶点发送到GPU,而不是通过反复调用glVertex3f递增。

4

从函数调用开销的角度来看,第二种方法更加昂贵。如果不是十个四元组,我们使用了一万个。然后,glBegin/glEnd将被称为每帧一万次而不是一次。

更重要的是,从OpenGL 3.0开始,glBegin/glEnd已被弃用,OpenGL ES不支持。

而是使用诸如glDrawArrays之类的调用将顶点上载为顶点数组。教程和更深入的信息可以在NeHe site上找到。

0

你会得到更好的性能一定能在到底有多少代码被由CPU调用。

无论您的绘图性能在GPU上是否会更好,这完全取决于您的3D图形卡驱动程序的实现。使用不同制造商的驱动程序,甚至是同一张卡的不同版本的驱动程序,您可能会得到潜在的大不相同的结果。