4

私は個人的な Java OpenGL (JOGL) プロジェクトに取り組んでおり、個別の描画関数と頂点を持ついくつかのカスタム オブジェクトを使用しています。

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); 

}

次に、これらの立方体の束全体をループして、描画関数を呼び出します。私の質問は次のとおりです。すべての頂点を 1 つの大きな glDrawArrays 呼び出しに集める必要がありますか。つまり、すべての頂点を 1 つの大きな配列に集めて描画する必要がありますか? パフォーマンスと fps に大きな影響を与えますか?

4

2 に答える 2

6

一般的なルールは、OpenGL呼び出しの数を最小限に抑えることです。特に、ネイティブコードとのインターフェイスにオーバーヘッドがあるJavaやC#などの言語ではそうです。ただし、同じ描画の異なる部分に2つの別々のモデル行列を適用することはできないため、プロパティのいずれかが変更される場合(異なるモデルマトリックスの適用、異なる色の適用など)は、異なるオブジェクトをグループ化しないでください。電話。したがって、基本的に、すべてのキューブが変更されない場合は、すべてをグループ化することをお勧めします。それ以外の場合は、別々に保持します。

パフォーマンスに役立つもう1つのことは、状態の変化の数を最小限に抑えることです。10,000個の立方体を描画している場合は、glEnableClientStateglDisableClientState呼び出しをcubedrawメソッドから移動し、すべての立方体が描画される前/後にのみ呼び出します。すべて同じテクスチャを使用している場合は、最初にテクスチャを1回バインドし、最後に1回バインドを解除します。

ああ、パフォーマンスが本当に心配な場合は、ほとんどのコンピューター(2年前のネットブックでも)がOpenGL 1.5をサポートしているため、データをVBOに移動すると、パフォーマンスが大幅に向上します。また、 Minecraftのようなことをしている場合、最適化の最良の方法は、すべての立方体を調べて、表面の面だけを描くことです。

于 2012-04-14T19:22:43.703 に答える
1

パフォーマンスに関する懸念がある場合は、提案された実装のいずれかで大きな変化は見られないと思います...

私の過去の経験から、パフォーマンスを向上させることができる1つのことは、リストを使用することです(確かにメモリパフォーマンスが向上します)。

これは良いOpenglボトルネックpdfです

于 2012-04-14T19:18:05.043 に答える