顶点阵列性能问题

时间:2012-06-17 12:15:33

标签: android opengl-es

我已经有一段时间对OpenGL进行编程了,但我对OpenGL ES很新。我遇到的一个问题是以高效的方式在屏幕上绘制基元。

我需要在屏幕上绘制一些相等的线路循环(使用不同的转换),并注意到此代码的性能下降:

gl.glColor4f(0.5f, 0.5f, 0.5f, 1.0f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, this.vertices);

for (int j = 0; j < height; j++)
{
    for (int i = 0; i < width; i++)
    {
        gl.glPushMatrix();

        gl.glTranslatef(i, j, 0);
        gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4);

        gl.glPopMatrix();
    }
}

我认为 glDrawArrays 在这里是坏人。

所以问题是如何有效地绘制一堆线路循环?使用GL_LINE_LOOP时,必须为每个基元调用glDrawArrays,所以是否需要将类型更改为GL_LINES?这会产生巨大的内存浪费,因为顶点数组(在上面的代码中,保存4个顶点)将保持 width * height * 8 顶点。

我正在为Android OpenGL ES 1.1编程。

2 个答案:

答案 0 :(得分:1)

  

我认为glDrawArrays在这里是坏人。

坏人就是你,使用你的函数调用/上下文切换预算效率低下。将所有行包装成一个数组(如GL_LINES),并通过一次调用将其发送到GPU。不,你不浪费记忆,因为你不能分配不到一页(通常是4kiB)。

答案 1 :(得分:1)

  

我认为glDrawArrays在这里是坏人。

是和否。你说DrawArrays不是一个快速调用你是正确的,但如果你不经常调用它,它是渲染东西的最快方法。

  

所以我需要将类型更改为GL_LINES吗?

是的,这样你就可以通过一次平局调用来绘制所有内容

  

这会造成巨大的内存浪费,因为顶点数组(在上面的代码中,保存4个顶点)将保持宽度*高度* 8个顶点。

与4个顶点相比,我猜你可以把它看作是一个记忆浪费。但GPU是内置一次渲染大批量,它会讨厌你抽出很多小批量。

此外,你应该有足够的内存来容纳顶点,这应该不是问题。