android OpenGL ES简单平铺生成器性能问题

android OpenGL ES简单平铺生成器性能问题,android,opengl-es,Android,Opengl Es,就这个问题: 感谢之前的回复,并从中获得了灵感,我开始为我的简单2D zelda类游戏项目构建一个简单的瓷砖生成器 我现在可以使用相同的纹理平铺生成贴图,使用2作为。。叠瓦迭代以绘制水平和垂直瓷砖,并获得一些基本的DPAD键输入侦听器以在x轴和y轴上滚动 但是现在我遇到了我的第一个性能问题,只有一个纹理和一个模型 当尝试构建一个10x10的地图时,滚动是精细而平滑的 当尝试使用50x50时,情况会变得更糟,而使用100x100时,它的方式是不可接受的 有没有办法只告诉OpenGL渲染我的地图集的

就这个问题:

感谢之前的回复,并从中获得了灵感,我开始为我的简单2D zelda类游戏项目构建一个简单的瓷砖生成器

我现在可以使用相同的纹理平铺生成贴图,使用2作为。。叠瓦迭代以绘制水平和垂直瓷砖,并获得一些基本的DPAD键输入侦听器以在x轴和y轴上滚动

但是现在我遇到了我的第一个性能问题,只有一个纹理和一个模型

当尝试构建一个10x10的地图时,滚动是精细而平滑的

当尝试使用50x50时,情况会变得更糟,而使用100x100时,它的方式是不可接受的

有没有办法只告诉OpenGL渲染我的地图集的“可见”部分而忽略隐藏的瓷砖?我是个全新的人

我正在使用

GLU.gluLookAt(gl, cameraPosX, cameraPosY, 10.0f,cameraPosX, cameraPosY, 0.0f, 0.0f, 1.0f, 0.0f);
为2D样式的感觉设置相机和视角

有什么帮助吗

for (int j = 0; j < 10; j++) {

        for (int i = 0; i < 10; i++) {

            gl.glPushMatrix(); // Sauvegarde la matrice sur le stack

            //Bind the texture according to the set texture filter
            gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[filter]);
            //Set the face rotation
            gl.glFrontFace(GL10.GL_CW);
            //Enable texture state
            gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
            //Enable vertex state
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            //Point to our vertex buffer
            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
            //point to our texture buff
            gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
            //Draw the vertices as triangle strip
            gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
            //Disable the client state before leaving
            gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

            gl.glTranslatef(1.0f, 0.0f, 0.0f); // on avance d'une tile
        }
        // on va commencer a dessiner la 2e ligne
        gl.glPopMatrix(); // Rappelle la matrice sur le stack
        gl.glTranslatef(0.0f, -1.0f, 0.0f);
    }

您可以轻松地使循环仅绘制可见的咏叹调。 下面是一些需要如何完成的示例。我不知道android API,所以将我的示例作为元代码线程

int cols = SCREEN_WIDTH / TILE_SIZE + 1;      // how many columns can fit on the screen
int rows = SCREEN_HEIGHT / TILE_SIZE + 1;     // haw many rows can fit on the screen
int firstVisibleCol = cameraPosX / TILE_SIZE; // first column we need to draw
int firstVisibleRow = cameraPosY / TILE_SIZE; // first row we need to draw

// and now the loop becomes
for (int j = firstVisibleRow; j < rows; j++) {
    for (int i = firstVisibleCol ; i < cols; i++) {
        ...
    }
}

循环变慢的原因是它使OpenGL做了很多不必要的工作。这是因为存在大量冗余状态更改

这意味着您正在使用没有任何效果的参数调用gl函数。调用这些函数会占用大量CPU时间,并可能导致整个OpenGL管道暂停,因为它无法非常有效地工作

例如,仅当要更改所使用的纹理时,才应调用glBindTexture。上面的代码在内部循环中一次又一次地绑定相同的纹理,这非常昂贵。类似地,不需要在内部循环中启用和禁用纹理坐标和顶点阵列。即使在内部循环中设置纹理坐标指针和顶点指针也是不必要的,因为它们在后续循环之间不会改变

底线是,在内部循环中,您应该只更改转换并调用gldrawArray。其他一切都会白白消耗资源

你可以做一些更高级的事情来加速这个过程。可以绘制平铺背景,这样它只会导致对GLDrawArray或glDrawElements的一次调用。如果你感兴趣,你应该在谷歌上搜索诸如批处理和纹理地图集之类的主题