Java JOGL-在大数组缓冲区上调用glMapBuffer后性能低下
我遇到了一个奇怪的问题,我想更新包含大约50万个元素(顶点)的数组缓冲区,所以我调用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
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倍,并将其作为环形缓冲区写入,只写入一部分,然后渲染另一部分。