java - 我应该使用多个 glDrawArrays() 还是将所有顶点收集到一个大的 glDrawArrays 调用中?

标签 java opengl jogl vertex-array

我正在处理一个个人 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 有多大帮助?

最佳答案

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

另一件有助于提高性能的事情是尽量减少状态更改的次数。如果您要绘制 10,000 个立方体,请将 glEnableClientStateglDisableClientState 调用移出立方体 draw 方法,并且仅在所有绘制之前/之后调用它们绘制立方体。如果它们都使用相同的纹理,则在开始时绑定(bind)一次纹理并在最后解除绑定(bind)一次。

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

关于java - 我应该使用多个 glDrawArrays() 还是将所有顶点收集到一个大的 glDrawArrays 调用中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10156082/

相关文章:

java - JOGL中如何接受用户键盘输入?

c++ - 带有纹理的卡通着色器。这个可以优化吗?

c++ - 在 Qt 中渲染巨大的图像

c++ - 如何使用 OpenGL 加载 8 位 bmp?

java - Spring项目中出现依赖关系不满足的错误

java - JOGL 程序纹理在缩放时会出现 Blob

java - 模拟事件派发线程

java - Maven 构建失败 - 编译器插件

java - 发现很长,需要 boolean 值(插入 SQLite [Android])

java - 删除 Java 列表中的重复字符串