Java JOGL-在大数组缓冲区上调用glMapBuffer后性能低下

Java JOGL-在大数组缓冲区上调用glMapBuffer后性能低下,java,opengl,jogl,Java,Opengl,Jogl,我遇到了一个奇怪的问题,我想更新包含大约50万个元素(顶点)的数组缓冲区,所以我调用glMapBuffer(…),对一些元素执行一些操作,然后调用glUnmapBuffer(…),但从那以后,我的程序变慢了,尽管我偶尔会做一次这样的操作。 这是密码 gl.glBindBuffer(gl.GL_ARRAY_BUFFER, VBOVertices[0]); ByteBuffer verticesByteBuffer = gl.glMapBuffer(gl.GL_AR

我遇到了一个奇怪的问题,我想更新包含大约50万个元素(顶点)的数组缓冲区,所以我调用
glMapBuffer(…)
,对一些元素执行一些操作,然后调用
glUnmapBuffer(…)
,但从那以后,我的程序变慢了,尽管我偶尔会做一次这样的操作。 这是密码

        gl.glBindBuffer(gl.GL_ARRAY_BUFFER, VBOVertices[0]);

        ByteBuffer verticesByteBuffer = gl.glMapBuffer(gl.GL_ARRAY_BUFFER, gl.GL_WRITE_ONLY);

        FloatBuffer verticesBuffer = verticesByteBuffer.asFloatBuffer();

        for(int i=0;i<verticesToBeChanged.size();i++) {
            int vertexId = verticesToBeChanged.get(i);
            verticesBuffer.position(vertexId*8);
            verticesBuffer.put(vertices[vertexId].position.x);
            verticesBuffer.put(vertices[vertexId].position.y);
            verticesBuffer.put(vertices[vertexId].position.z);
        }
        gl.glUnmapBuffer(gl.GL_ARRAY_BUFFER);
gl.glBindBuffer(gl.gl_数组_BUFFER,VBOVertices[0]);
ByteBuffer verticesByteBuffer=gl.glMapBuffer(仅gl.gl_数组_缓冲区,gl.gl_写入_);
FloatBuffer verticesBuffer=verticesByteBuffer.asFloatBuffer();

对于(int i=0;iglMapBufferRange),JOGL 2中存在:

关于
glMapBufferRange(…)你是对的
。我怀疑问题在于您正在尝试映射用于绘图的顶点缓冲区。GL必须插入一些隐式同步,以确保对该内存的更改不会影响尚未完成的命令。如果没有其他方法使VBO无效,您可以尝试双缓冲VBO(例如,孤立)缓冲区。这些都不用了。你应该去掉
glMapBuffer
,因为它会强制cpu gpu同步。如果不能,请将其放大3倍,并将其作为环形缓冲区写入,只写入一部分,然后渲染另一部分。