openGL GL_STATIC_DRAW vs GL_STATIC_READ性能

时间:2014-08-14 07:20:56

标签: opengl jogl

使用此初始化块:

public void init(GL gl) {
      buffer = new int[1];
      gl.glGenBuffers(1, buffer, 0);

     VBOVertices = buffer[0];
     gl.glBindBuffer(GL.GL_ARRAY_BUFFER, VBOVertices);
     gl.glBufferData(GL.GL_ARRAY_BUFFER, vertices.limit() * BufferUtil.SIZEOF_FLOAT, vertices, GL.GL_STATIC_DRAW);
     gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);

     init = true;

}

这个渲染块:

public void display(GL gl) {
    gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL.GL_COLOR_ARRAY);

    gl.glEnable(GL.GL_BLEND);
    gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE);
    gl.glBlendEquation(GL.GL_FUNC_ADD);

    gl.glDepthMask(false);
    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, VBOVertices);
    gl.glColorPointer(4, GL.GL_FLOAT, 7 * 4, 3 * 4);
    gl.glVertexPointer(3, GL.GL_FLOAT, 7 * 4, 0);

    gl.glDrawArrays(GL.GL_LINE_STRIP, 0, vertices.limit() / 7);

    gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL.GL_COLOR_ARRAY);

}

我对某些显卡(GeForce GT 750M)造成了严重的性能损失,当我将GL.GL_STATIC_DRAW更改为GL.GL_STATIC_READ时,它会消失,我不明白为什么。 我曾尝试使用填充顶点,但这并没有改变任何东西。有人可以解释这种行为吗?

1 个答案:

答案 0 :(得分:1)

GL_STATIC_READ是一个奇怪的提示,因为它基本上是说“我要从CPU上的这个缓冲区读取很多,但只会写入一次(或几次)”,所以它是在glBufferData中使用是可疑的。它通常表示您要将数据从另一个缓冲区复制到其中。 GL客户端实现中最明显的行为是在系统内存中分配这样的缓冲区,而不是在GPU上。

这意味着,由于某些原因,您的视频卡比GPU专用内存更好地从系统内存中读取数据。可能有多种原因,例如GPU内存拥塞,对齐问题,驱动程序错误等。

当然,您可以通过启用某些GL调试功能并设置调试回调来获取更多信息。通常情况下,当你做一些通过这些回调杀死表现的东西时,司机会告诉你。完全可能只是通过这个怪癖暴露出来的东西。