0

タイトルのように、glBeginとglEndをフレーム/更新ごとに1回だけ呼び出すことができるようにしたいと思います。これは、更新ごとに複数回呼び出すと大幅に遅くなることを聞いて経験しているためです。

これは私のレンダリング関数のコードです:

GL11.glTranslatef(0, 0, -10);
    int x = 0;

    while (x < World.BLOCKS_WIDTH - 1) {
        int y = 0;
        while (y < World.BLOCKS_HEIGHT - 1) {

            if( x * World.BLOCK_SIZE  <= Display.getHeight() ||  y * World.BLOCK_SIZE <= 
                Display.getWidth() ||  x * World.BLOCK_SIZE >= 0 || 
                y * World.BLOCK_SIZE >= 0 ) {

            blocks.b[data.blocks[x][y]].draw(x + Main.PosX, y + Main.PosY);

            }

            y++;
        }
        x++;

}

助けていただければ幸いです。

これは私のブロッククラスです:

GL11.glPushMatrix();
    GL11.glTranslatef(Xa * World.BLOCK_SIZE, Ya * World.BLOCK_SIZE, 0);
    //GL11.glRotatef(0, 0, 1, 0);
    //GL11.glRotatef(0, 1, 0, 0);

    Texture.bind();



        GL11.glBegin(GL11.GL_QUADS);
        GL11.glColor3f(1f, 1f, 1f);
        //GL11.glNormal3f(0, 0, 1);
        GL11.glTexCoord2f(0, 0);
        GL11.glVertex2f(0, 0);
        GL11.glTexCoord2f(0, 1);
        GL11.glVertex2f(0, S);
        GL11.glTexCoord2f(1, 1);
        GL11.glVertex2f(S, S);
        GL11.glTexCoord2f(1, 0);
        GL11.glVertex2f(S, 0);
        GL11.glEnd();


        GL11.glPopMatrix();

}

PS。少し純粋なOpenGLを理解できます。

4

2 に答える 2

5

スローダウンは glBegin…glEnd によるものではなく、膨大な数の glNormal、glTexCoord、… glVertex 呼び出しによるものです。これは即時モードと呼ばれ、頂点配列をサポートする OpenGL-1.1 がリリースされて以来、時代遅れになっています。それは15年以上前のことです。

できれば頂点バッファ オブジェクトと組み合わせて、頂点配列を使用してください。本当のパフォーマンスの向上はここからです。

于 2013-03-01T12:47:34.033 に答える
1

即時モードでは、すべてのフレームで既にレンダリングされるドロー コールが送信されます。そのようにする必要はありません。頂点バッファー オブジェクトについて学習することをお勧めします。それらは同様の頂点をグループ化し、フレームごとに 1 回 GPU に送信し、変更することができます。それらはストレージに floatbuffers を使用し、オブジェクトをレンダリングする新しい方法です。LWJGL のチュートリアルについては、YouTube で TheCodingUniverse を検索し、彼の Advanced Rendering ビデオを探してください。VBO の使用方法が示されています。

于 2013-03-02T08:44:57.620 に答える