使用此初始化块:
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时,它会消失,我不明白为什么。 我曾尝试使用填充顶点,但这并没有改变任何东西。有人可以解释这种行为吗?
答案 0 :(得分:1)
GL_STATIC_READ
是一个奇怪的提示,因为它基本上是说“我要从CPU上的这个缓冲区读取很多,但只会写入一次(或几次)”,所以它是在glBufferData中使用是可疑的。它通常表示您要将数据从另一个缓冲区复制到其中。 GL客户端实现中最明显的行为是在系统内存中分配这样的缓冲区,而不是在GPU上。
这意味着,由于某些原因,您的视频卡比GPU专用内存更好地从系统内存中读取数据。可能有多种原因,例如GPU内存拥塞,对齐问题,驱动程序错误等。
当然,您可以通过启用某些GL调试功能并设置调试回调来获取更多信息。通常情况下,当你做一些通过这些回调杀死表现的东西时,司机会告诉你。完全可能只是通过这个怪癖暴露出来的东西。