我在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...
在这种情况下,所有四边形都使用相同的纹理。
答案 0 :(得分:10)
是的,第一个更快,因为每次调用glBegin
或glEnd
都会更改OpenGL状态。
然而,与对glBegin
和glEnd
的一次调用(如果您有大量顶点)相比,更好的方法是使用glVertexPointer(和朋友)传递所有顶点),然后拨打glDrawArrays或glDrawElements。这将一举将所有顶点发送到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图形卡的驱动程序的实现。使用不同制造商的驱动程序,甚至使用同一张卡的不同版本的驱动程序,您可能会得到截然不同的结果。