이상한 문제가있어서 약 50 만 개의 요소 (정점)가 포함 된 배열 버퍼를 업데이트하려고하므로 일부 요소에서 일부 작업을 수행합니다 (glMapBuffer(...)
). 그리고 glUnmapBuffer(...)
이라고 부르십시오. 그러나 잠시 후에이 작업을 한 번 수행해도 프로그램이 느려집니다. 는 여기에 내가 뭔가 잘못하고 코드JOGL - 큰 배열 버퍼에서 glMapBuffer를 호출 한 후 성능이 저하됨
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);
암의 경우, 또는이는 대용량 데이터 세트에 대한 작동하는 방법입니까? glMapBufferRange(...)
메서드는 JOGL에 존재하지 않기 때문에 사용할 수 없습니다.
당신은'glMapBufferRange (...)'에 대한 권리입니다. 문제는 당신이 드로잉에 사용되는 정점 버퍼를 매핑하려고하는 것입니다. GL은이 메모리를 변경해도 아직 완료되지 않은 명령에 영향을주지 않도록하기 위해 암시 적 동기화를 삽입해야합니다. 다른 방법으로 버퍼를 무효화 (예 : 고아)하지 않은 경우 VBO를 이중 버퍼링 할 수 있습니다. 이것은 모두 disused [여기] (http://www.opengl.org/wiki/Buffer_Object_Streaming)입니다. –
cpu-gpu 동기화를 강제하기 때문에'glMapBuffer'를 제거해야합니다. 할 수 없다면 3 배 더 크게 만들고 링 버퍼로 쓰고 한 부분에만 쓰고 다른 부분은 렌더링하십시오. – elect