2014-01-19 5 views
0

이상한 문제가있어서 약 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에 존재하지 않기 때문에 사용할 수 없습니다.

+0

당신은'glMapBufferRange (...)'에 대한 권리입니다. 문제는 당신이 드로잉에 사용되는 정점 버퍼를 매핑하려고하는 것입니다. GL은이 메모리를 변경해도 아직 완료되지 않은 명령에 영향을주지 않도록하기 위해 암시 적 동기화를 삽입해야합니다. 다른 방법으로 버퍼를 무효화 (예 : 고아)하지 않은 경우 VBO를 이중 버퍼링 할 수 있습니다. 이것은 모두 disused [여기] (http://www.opengl.org/wiki/Buffer_Object_Streaming)입니다. –

+0

cpu-gpu 동기화를 강제하기 때문에'glMapBuffer'를 제거해야합니다. 할 수 없다면 3 배 더 크게 만들고 링 버퍼로 쓰고 한 부분에만 쓰고 다른 부분은 렌더링하십시오. – elect

답변