在LWJGL中提高渲染性能的最佳方法

时间:2018-07-05 15:46:18

标签: java lwjgl

大家好,我最近一直在开发游戏,我正在尝试在低端计算机上对其进行优化。这是基于2D瓷砖的游戏(换句话说,我在屏幕上绘制了许多四边形)。我首先使用即时模式,速度大约为40-50fps,具体取决于屏幕上的对象数量,然后使用显示列表,其中fps几乎没有或没有增加,然后再次使用VBO却几乎没有fps的增加,现在我切换回显示列表。我相信我的性能上限是在渲染四边形时进行的许多变换,例如平移,缩放和旋转。我的问题是如何减少每次绘画调用所需的变换次数,以提高fps。

创建列表。

    quad = glGenLists(1);
    glNewList(quad, GL_COMPILE);
        glBegin(GL_QUADS);
            glTexCoord2f(0,0);
            glVertex2f(0,0);

            glTexCoord2f(1,0);
            glVertex2f(1,0);

            glTexCoord2f(1,1);
            glVertex2f(1,1);

            glTexCoord2f(0,1);
            glVertex2f(0,1);
        glEnd();
    glEndList();

然后对于每个四边形,我的draw方法看起来都像这样。

    tex.bind();
    GL11.glEnable(GL11.GL_BLEND);
    GL11.glEnable(GL11.GL_TEXTURE_2D);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

    glPushMatrix();

    glTranslatef(InputControl.zoomPosX, InputControl.zoomPosY, 0);
    glScaled(zoom,zoom, 0); 
    glTranslatef(-InputControl.zoomPosX, -InputControl.zoomPosY, 0);

    glTranslatef(x+ width / 2, y + height / 2, 0);
    glRotatef(angle, 0 ,0 , 1);
    glTranslatef(- width / 2, - height / 2, 0);

    glColor4f(r,g,b, alpha);
    glScaled(width,height,0);
    glCallList(quad);

    glPopMatrix();

1 个答案:

答案 0 :(得分:0)

几件事:

  • 忘记显示列表。它已被弃用,某些驱动程序通过VBO实现了它。 最好使事情变得现代而明确。

  • 使用采样器,在其上设置min / mag滤镜和环绕声,如果所有纹理的所有设置都相同,则将其绑定一次。

  • 对于混合相同,如果始终相同,则将其从四边形循环中取出。

  • 尝试将所有顶点数据(包括颜色)上传到VBO。

  • 如果纹理具有相同的尺寸,请使用纹理数组。与矩阵相同,一次计算所有矩阵,并在开始时上传一次。然后,使用实例渲染并使用索引访问着色器中的第i个矩阵和纹理