OpenGL四重渲染优化

时间:2009-07-12 16:29:20

标签: optimization opengl 2d

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

在这种情况下,所有四边形都使用相同的纹理。

6 个答案:

答案 0 :(得分:10)

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

然而,与对glBeginglEnd的一次调用(如果您有大量顶点)相比,更好的方法是使用glVertexPointer(和朋友)传递所有顶点),然后拨打glDrawArraysglDrawElements。这将一举将所有顶点发送到GPU,而不是通过反复调用glVertex3f逐步发送。

答案 1 :(得分:4)

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

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

而是使用glDrawArrays等调用将顶点作为顶点数组上传。可以在NeHe site上找到教程和更深入的信息。

答案 2 :(得分:3)

我决定继续使用10,000个四边形循环对其进行基准测试。

结果:

方法1:0.0128秒

方法2:0.0132秒

方法#1确实有一些改进,但改善非常微不足道(3%)。它可能只是简单地调用更多函数的开销。因此,OpenGL本身可能无法从方法#1获得任何额外的优化。

这是在使用OpenGL 2.0和visual studio 2005的Windows XP Service Pack 3上。

答案 3 :(得分:2)

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

schnaader:你读到的文件中的意思是你不应该在glBegin和glEnd之间有非gl相关的代码。它们并不意味着你应该多次调用它来短时间调用它。

答案 4 :(得分:0)

我认为通过重用顶点可以获得最高的性能提升。要实现这一点,您需要自己维护一些原语结构。

答案 5 :(得分:0)

在CPU调用多少代码时,您可以获得更好的性能。

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