2016-04-23 73 views
1

我正在寫一個使用JFrame和OpenGL的jogl程序來顯示1500個旋轉立方體(由六個方塊繪製)。每個都有不同的尺寸,轉速和方向。最大幀數大約爲25.我認爲這很慢。我沒有實現燈光效果和其他東西。我的筆記本電腦是幾個月前購買i7的13英寸Macbook Air。這是我的代碼供您參考。你能否給我一些建議來改善我的計劃表現?建議不適合我的情況也受到歡迎。例如,哪種gl或flu功能會減慢我的電腦速度?我應該避免哪一個?或者,哪些可以替換?最後,我如何檢查我的程序的整體性能,以及如何知道我的程序已經優化?我應該怎麼做才能優化我的jogl性能?

public void draw(GLAutoDrawable drawable) { // this is a method called in the display method. 

    GL2 gl = drawable.getGL().getGL2(); 
    gl.glMatrixMode(GL2.GL_MODELVIEW);  
    if (Constants.p == null) return; 
    for (Primitives p : Constants.p) { //Constants is a class that holds all the global variables 

     gl.glLoadIdentity(); 
     gl.glTranslated(p.centerPoint.x,p.centerPoint.y, p.centerPoint.z); 
     gl.glRotated(p.angle, p.direction.x, p.direction.y, p.direction.z);p.angle += p.speed;p.angle = p.angle % 360; 


     if (Constants.modes == 0) { //draw using lines 
      gl.glBegin (GL2.GL_LINES);//static field 

        for (Integer[] l : p.line) { 

         gl.glColor3d(p.color.get(l[0]).x,p.color.get(l[0]).y,p.color.get(l[0]).z); 
         gl.glVertex3d(p.vert.get(l[0]).x, p.vert.get(l[0]).y, p.vert.get(l[0]).z); 
         gl.glColor3d(p.color.get(l[1]).x,p.color.get(l[1]).y,p.color.get(l[1]).z); 
         gl.glVertex3d(p.vert.get(l[1]).x, p.vert.get(l[1]).y, p.vert.get(l[1]).z); 
        } 

      gl.glEnd(); 
     } else if (Constants.modes == 1) { //draw using squares 
      gl.glBegin (GL2.GL_QUADS);//static field 

      for (Integer[] f : p.face) { 

       for (Integer l : f) { 

        for (Integer i : p.line.get(l)) { 

         gl.glColor3d(p.color.get(i).x,p.color.get(i).y,p.color.get(i).z); 
         gl.glVertex3d(p.vert.get(i).x, p.vert.get(i).y, p.vert.get(i).z); 

        } 

       } 
      } 

      gl.glEnd(); 
     } 

    } 

} 
+1

想想目實例化太:https://www.opengl.org/sdk/docs/man/html/glDrawElementsInstanced.xhtml您可以使用截錐體剔除,貢獻剔除,門戶剔除,...我主要同意選舉,但基於JOGL的更高級別解決方案可能適合您的需求,即像LibGDX,JMonkeyEngine,JogAmp的Ardor3D Continuation(我維護它) ,... – gouessej

+1

請提供SSCCE:http://sscce.org它將幫助我們確定要優化的內容。即使您的目標是低端硬件,也不要使用即時渲染,效率不高。 – gouessej

回答

2

其中GL或流感的功能將我的電腦慢下來?我應該在哪一個 避免?或者,哪些可以替換?

您應該避免以下調用,因爲棄用:

glMatrixModeglLoadIdentityglTranslatedglRotated

,尤其是其中的一個,因爲他們也很低效:

glBeginglColor3dglVertex3dglEnd

實際上,您每次發送的數據非常少,而您的gpu在執行時大大欠缺,大部分時間都在等待數據。

要改變這一點,你必須做幾件事情,這可能會帶給你一個提升甚至上百倍的提升。

對於所有的矩陣操作,可以使用JOGL util的FloatUtil或使用一個庫,如joml或我的jglm,然後將其上傳到一個均勻的或可變的均勻緩衝對象(UBO)。

對於頂點和顏色,您應該使用頂點緩衝對象(VBO)。基本上你會在開始時將所有數據打包在一起,將它們上傳到GPU,設置一些參數,然後啓動將直接從這些(這些)緩衝區中獲取數據的渲染調用。

如果您暫時不需要任何GUI(例如awt,swt或swing),您可以使用高性能的本地工具包Newt

我建議你,而不是修改你的代碼,從一個堅實的工作場景開始,比如我的Hello Triangle(GL4需要OpenGL4.5,OSX只提供4.1,你應該修改它,但目前不建議這樣做)。

然後,一旦你得到它運行,學習一點代碼,以瞭解基本知識。然後開始在上面建立你的代碼。

通過這種方式,一旦您應用了修改,您就可以測試並查看它是否有效,如果不能,您知道錯誤可能出現在您最後的嘗試中。

如果你有任何問題,請不要猶豫,尋求幫助:)

+1

謝謝!這非常有用。看起來我必須學習一套全新的方法來構建我的程序T_T。 – FunnyFunkyBuggy

+0

是的,但是一旦你完成了,你將會真正知道圖形管道中會發生什麼,你將得到完全控制:) – elect

+0

Ps:對於矩陣,你也可以使用'float FloatUtil' – elect

相關問題