2012-04-14 70 views
3

我正在開發一個個人Java OpenGL(JOGL)項目,我正在使用一些具有獨立繪圖函數和頂點的自定義對象。我應該使用幾個glDrawArrays()還是將所有頂點收集到一個大的glDrawArrays調用?

public class Cube extends PhysicalObject { 

public void draw(GL gl) { 

     gl.glColor3f(1.0f, 1.0f, 0.0f); 

     gl.glEnableClientState(GL.GL_VERTEX_ARRAY); // Enable Vertex Arrays 

      gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY); 

      gl.glVertexPointer(3, GL.GL_FLOAT, 0, vertices); 

      gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, texCoords); 

      gl.glDrawArrays(GL.GL_QUADS, 0, 4*6); 


      gl.glDisableClientState(GL.GL_VERTEX_ARRAY); 

      gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY); 

} 

然後我通過一大堆這些立方體循環,調用它們的繪製函數。 我的問題如下: 我應該把所有的頂點都收集到一個大的glDrawArrays調用中,即把所有的頂點都收集到一個大的數組中並繪製它?它對性能和fps有很大的幫助嗎?

回答

6

的一般規則是,以儘量減少OpenGL的調用的次數,特別是在如Java或C#那裏的開銷與本地代碼的接口語言。但是,如果任何屬性不斷變化(應用不同的模型矩陣,具有不同的顏色等),則不應將不同的對象組合在一起,因爲無法將兩個單獨的模型矩陣應用於同一個繪製的不同部分呼叫。所以基本上,如果所有的立方體都不會改變,最好將它們組合在一起,否則將它們分開。

對性能有幫助的另一件事是最小化狀態變化的次數。如果您要繪製10,000個立方體,請將glEnableClientStateglDisableClientState調用移出立方體draw方法,並且僅在繪製所有立方體之前/之後調用它們。如果他們都使用相同的紋理,請在開始時綁定一次紋理,並在最後解除綁定。

哦,如果你真的擔心性能,大多數電腦(甚至2年前的上網本)都支持OpenGL 1.5,所以將你的數據移動到VBOs會給你帶來顯着的性能優勢。如果你正在做類似Minecraft的東西,那麼最好的優化方法是通過所有的立方體,只繪製表面。

1

如果您關注的是關於性能,我不認爲你會看到要麼你提出的實現非常大的變化......

根據我以往的經驗,一方面,可以使性能提高將會使用List(肯定會有更好的內存性能)。

這是一個很好的Opengl bottleneck PDF

+0

我不確定您的意思是「列表」。 ArrayList或VertexBufferObject,還是我在這裏忽略了一點? – JulenissensHjelper 2012-04-14 19:25:20

+1

我的appologies,如果它不清楚...他們被稱爲「CallList」或「DisplayList」。 http://www.swiftless.com/tutorials/opengl/displaylists.html – Erwald 2012-04-14 19:27:45

+0

好的,謝謝......我會研究一下。 – JulenissensHjelper 2012-04-14 19:31:33

相關問題