1

我已经编写 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 个顶点)将保存宽度 * 高度 * 8个顶点。

我正在为 Android OpenGL ES 1.1 编程。

4

2 回答 2

1

我认为 glDrawArrays 是这里的坏人。

坏人是你,如此低效地使用你的函数调用/上下文切换预算。将所有行打包到一个数组中(作为 GL_LINES),并通过一次调用将其发送到 GPU。不,你没有浪费内存,因为无论如何你不能分配少于一页(通常是 4kiB)。

于 2012-06-17T12:23:51.417 回答
1

我认为 glDrawArrays 是这里的坏人。

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

那么我需要将类型更改为 GL_LINES 吗?

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

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

与只有 4 个顶点相比,我想您可以将其视为内存浪费。但是 GPU 是为一次渲染大批量而构建的,它会讨厌你绘制大量的小批量。

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

于 2012-06-17T12:26:13.370 回答