2016-04-23 5 views
1

私はJFrameとOpenGLを使って1,500回転の立方体(6つの正方形で描かれた)を表示するジョグルプログラムを作成しています。サイズ、回転速度、方向がそれぞれ異なる。最大のfpsは約25です。私はそれがかなり遅いと思います。私は照明効果やその他のものを実装していません。私のラップトップは、数インチ前に買ったi7を搭載した13インチMacbookの空気です。あなたの参照のための私のコードはここにあります。私のプログラムのパフォーマンスを向上させるためのアドバイスをしていただけますか?私の状況に適していないアドバイスも歓迎されます。たとえば、どのglまたはflu関数がコンピュータの速度を落としますか?どちらを避けるべきですか?または、どちらを交換することができますか?最後に、プログラムの全体的なパフォーマンスをどのように調べることができますか?また、自分のプログラムが最適化されていることをどのように知ることができますか? GLやインフルエンザの機能は自分のコンピュータが遅くなりますジョグルのパフォーマンスを最適化するにはどうすればよいですか?

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

?私は を避けるべきですか?または、どちらを交換することができますか?

廃止予定のため、

あなたは、次の呼び出しを回避する必要があります。

glMatrixModeglLoadIdentityglTranslated

、特にこれらの1、彼らはまた、非常に非効率的であるため、glRotated

glBeginglColor3dglVertex3dglEnd

本質的には、1時間に非常に少ないデータしか送信しておらず、実行時にgpuが大幅に使用されず、ほとんどの場合データの待機がストールします。

これを変更するには、数百倍もの速さでさえ増強する可能性のあるいくつかのことが必要です。

は、すべての行列操作のために、あなたはFloatUtil utilのJOGLを使用することができますかjomlや私jglmのようなライブラリを使用して、均一な変数または均一なバッファオブジェクト(UBO)にアップロードします。

頂点と色については、代わりに頂点バッファオブジェクト(VBO)を使用する必要があります。基本的には、開始時にすべてのデータを一まとめにまとめ、それらをgpuにアップロードし、いくつかのパラメータを設定してから、この(これらの)バッファから直接データを取得するレンダリング呼び出しを起動します。

awt、swt、swingなどのGUIを一切必要としない場合は、高性能ネイティブツールキットNewtを使用できます。

私はHello Triangleのような堅実で実用的なシナリオから始めることをお勧めします(GL4はOpenGL 4.5を必要とし、OSXは4.1までしか提供しないので、それを修正する必要がありますが、これは現時点ではお勧めできません)。

それを実行したら、基本を理解するためにコードを少し勉強してください。次に、その上にコードを構築します。

このようにして、修正を適用すると、その修正が適用されたかどうかをテストして確認できます。そうでない場合は、最後の試行でエラーが発生している可能性があります。

問題があったら、助けを求めることを躊躇しないでください:)

+1

ありがとう!これはとても便利です。私のプログラムT_Tを構築するための全く新しい一連のメソッドを学ばなければならないように見えます。 – FunnyFunkyBuggy

+0

しかし、いったんやったら、グラフィックパイプラインで何が起こるかを本当に知っているでしょう。フルコントロールを得るでしょう:) – elect

+0

Ps:行列の場合、joglのFloatUtil – elect

関連する問題