【问题标题】:Vertex Array Performance Issues顶点数组性能问题
【发布时间】:2012-06-17 12:15:33
【问题描述】:

我已经编写 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 编程。

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    我认为 glDrawArrays 是这里的坏人。

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      我认为 glDrawArrays 是这里的坏人。

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

      【讨论】:

      • “不能分配少于一页”?顶点数组不是在客户端分配的吗?
      • @JensÅkerblom:是的。客户端运行 Android,它运行在 Linux 内核上,以页为单位管理内存。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 2017-08-02
      • 2020-01-13
      • 1970-01-01
      相关资源
      最近更新 更多