Optimization OpenGL四元渲染优化

Optimization OpenGL四元渲染优化,optimization,opengl,2d,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 f

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

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

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


schnaader:您阅读的文档中的意思是,您不应该在glBegin和glEnd之间有与gl无关的代码。它们并不意味着您应该多次调用它,而不是在短位中调用它。

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

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


但是,比一次调用
glBegin
glEnd
(如果您有大量顶点)更好的是将所有顶点传递给(和朋友),然后再调用一次或。这将一次性将所有顶点发送到GPU,而不是通过反复调用
glVertex3f
来递增。从函数调用开销的角度来看,第二种方法成本更高。如果我们用一万而不是十个四边形。然后,glBegin/glEnd将被每帧调用一万次,而不是一次

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


相反,顶点通过调用(如glDrawArrays)上传为顶点数组。教程和更深入的信息可以在上找到。

我决定继续使用10000个四元组的循环对其进行基准测试

结果是:

方法1:0.0128秒

方法2:0.0132秒

方法#1确实有一些改进,但改进很小(3%)。这可能只是调用更多函数的开销。因此,OpenGL本身很可能不会从方法1中获得任何额外的优化


这是在使用OpenGL 2.0和visual studio 2005的Windows XP service pack 3上实现的。

可以肯定的是,在CPU调用多少代码方面,您将获得更好的性能


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

谢谢您的回答,我的结果发布在下面的回答中:)您是如何对其进行基准测试的?很难对OpenGL调用进行基准测试-仅在调用前后设置计时器并不一定要考虑将数据发送到GPU、GPU上的任何计算和渲染。在这种情况下,我只关心挂起线程所花费的时间。如果我的计时器在调用代码后被触发,那么从我的角度来看,这就是OpenGL花费的时间。在我使用的前一个引擎上,我们处理了一百万个小纹理,这意味着一百万个纹理调用,这意味着我们的游戏速度变慢。我只是想确保我们没有浪费OpenGL的时间,我不太关心它的内部性能,因为我不能改变这一点!我所做的假设是,一旦我和OpenGL谈过了,它就足够聪明,可以优化我给它发送到视频卡的任何东西,这是一个错误的假设吗?