2014-01-19 34 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。這是所有[這裏](http://www.opengl.org/wiki/Buffer_Object_Streaming)。 –

+0

你應該擺脫'glMapBuffer',因爲它強制cpu-gpu同步。如果你不能,把它放大3倍,並把它寫成一個環形緩衝區,只寫入一個部分並渲染另一個部分。 – elect

回答