android OpenGL ES简单平铺生成器性能问题
就这个问题: 感谢之前的回复,并从中获得了灵感,我开始为我的简单2D zelda类游戏项目构建一个简单的瓷砖生成器 我现在可以使用相同的纹理平铺生成贴图,使用2作为。。叠瓦迭代以绘制水平和垂直瓷砖,并获得一些基本的DPAD键输入侦听器以在x轴和y轴上滚动 但是现在我遇到了我的第一个性能问题,只有一个纹理和一个模型 当尝试构建一个10x10的地图时,滚动是精细而平滑的 当尝试使用50x50时,情况会变得更糟,而使用100x100时,它的方式是不可接受的 有没有办法只告诉OpenGL渲染我的地图集的“可见”部分而忽略隐藏的瓷砖?我是个全新的人 我正在使用android OpenGL ES简单平铺生成器性能问题,android,opengl-es,Android,Opengl Es,就这个问题: 感谢之前的回复,并从中获得了灵感,我开始为我的简单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的一次调用。如果你感兴趣,你应该在谷歌上搜索诸如批处理和纹理地图集之类的主题