我应该使用几个 glDrawArrays() 还是将所有顶点收集到一个大 glDrawArrays 调用?

Posted

技术标签:

【中文标题】我应该使用几个 glDrawArrays() 还是将所有顶点收集到一个大 glDrawArrays 调用?【英文标题】:Should I use several glDrawArrays() or gather all the vertices to one big glDrawArrays-call? 【发布时间】:2012-04-26 17:13:46 【问题描述】:

我正在开发一个个人 Java OpenGL (JOGL) 项目,我正在使用一些具有单独绘制函数和顶点的自定义对象。

public class Cube extends PhysicalObject 

 public void draw(GL gl) 

         gl.glColor3f(1.0f, 1.0f, 0.0f);

         gl.glEnableClientState(GL.GL_VERTEX_ARRAY);  // Enable Vertex Arrays

            gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY);  

            gl.glVertexPointer(3, GL.GL_FLOAT, 0, vertices); 

            gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, texCoords); 

            gl.glDrawArrays(GL.GL_QUADS, 0, 4*6);  


            gl.glDisableClientState(GL.GL_VERTEX_ARRAY);  

            gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY); 


然后我遍历一大堆这些立方体,调用它们的绘制函数。 我的问题如下: 我应该将所有顶点收集到一个大 glDrawArrays 调用,即将所有顶点收集到一个大数组并绘制它吗?它对性能和 fps 有很大帮助吗?

【问题讨论】:

【参考方案1】:

一般规则是尽量减少 OpenGL 调用的数量,尤其是在 Java 或 C# 等与本机代码交互存在开销的语言中。但是,如果它们的任何属性会发生变化(应用不同的模型矩阵、具有不同的颜色等),则不应将不同的对象组合在一起,因为不可能将两个单独的模型矩阵应用于同一绘图的不同部分称呼。所以基本上,如果你所有的立方体都没有改变,最好将它们全部组合在一起,否则将它们分开。

对性能有帮助的另一件事是尽量减少状态更改的次数。如果要绘制 10,000 个立方体,请将 glEnableClientStateglDisableClientState 调用移出立方体 draw 方法,并且仅在绘制所有立方体之前/之后调用它们。如果它们都使用相同的纹理,则在开始时绑定纹理一次,在结束时取消绑定一次。

哦,如果您真的担心性能,大多数计算机(甚至是使用 2 年的上网本)都支持 OpenGL 1.5,因此将您的数据移动到 VBOs 会给您带来显着的性能优势。如果你在做类似 Minecraft 之类的东西,那么最好的优化方法是遍历所有的立方体,只绘制表面。

【讨论】:

【参考方案2】:

如果您关心的是性能,我认为您提出的任何一个实现都不会有很大的变化......

根据我过去的经验,可以提高性能的一件事是使用 List(肯定会有更好的内存性能)。

这是一个很好的Opengl bottleneckpdf

【讨论】:

我不确定您所说的“列表”到底是什么意思。 ArrayList 或 VertexBufferObject,还是我错过了这里的重点? 如果不清楚,我很抱歉......它们被称为“CallList”或“DisplayList”。 swiftless.com/tutorials/opengl/displaylists.html

以上是关于我应该使用几个 glDrawArrays() 还是将所有顶点收集到一个大 glDrawArrays 调用?的主要内容,如果未能解决你的问题,请参考以下文章

PyOpenGL - 最小 glDrawArrays 示例

如何使用 glDrawArrays 和 glVertexPointer?

交错的 VBO 导致 glDrawArrays() 错误

使用 glDrawArrays 绘制多个模型

尝试在 C++ 中使用 glDrawArrays 时出错

在 glDrawArrays() 上调试 SIGKILL。苹果手机