大家好,我最近一直在开发游戏,我正在尝试在低端计算机上对其进行优化。这是基于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();
答案 0 :(得分:0)
几件事:
忘记显示列表。它已被弃用,某些驱动程序通过VBO实现了它。 最好使事情变得现代而明确。
使用采样器,在其上设置min / mag滤镜和环绕声,如果所有纹理的所有设置都相同,则将其绑定一次。
对于混合相同,如果始终相同,则将其从四边形循环中取出。
尝试将所有顶点数据(包括颜色)上传到VBO。
如果纹理具有相同的尺寸,请使用纹理数组。与矩阵相同,一次计算所有矩阵,并在开始时上传一次。然后,使用实例渲染并使用索引访问着色器中的第i个矩阵和纹理