0

如标题所示,我希望每帧/更新只能调用一次 glBegin 和 glEnd ,因为我听说过并且正在经历,如果每次更新多次调用它,它会大大减慢。

这是我的渲染功能代码:

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

立即模式发送绘制调用已在每一帧渲染,您无需尝试这样做。我建议您了解顶点缓冲区对象,它们将相似的顶点组合在一起并每帧将它们发送到 GPU 一次,并且可以进行修改。它们使用浮动缓冲区进行存储,是渲染对象的新方法。对于 LWJGL 教程,在 youtube 上搜索 TheCodingUniverse 并查找他的 Advanced Rendering 视频,它将向您展示如何使用 VBO。

于 2013-03-02T08:44:57.620 回答