gpt4 book ai didi

android OpenGL ES simple Tile generator 性能问题

转载 作者:搜寻专家 更新时间:2023-11-01 07:41:17 28 4
gpt4 key购买 nike

以下问题:Best approach for oldschool 2D zelda-like game

感谢之前的回复,主要灵感来自 http://insanitydesign.com/wp/projects/nehe-android-ports/ ,我开始为我的简单 2D 类塞尔达游戏项目构建一个简单的 Tile Generator。

我现在可以生成具有相同纹理图 block 的 map ,使用 2 for(..) 叠层迭代绘制水平和垂直图 block ,并获得一些基本的 DPAD 键输入监听器以在 x 轴和 y 轴上滚动。

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

尝试构建 10x10 map 时,滚动非常流畅。

尝试使用 50x50 时,情况会变得更糟,而使用 100x100 时,情况就变得 Not Acceptable 了。

有没有办法只告诉 OpenGL 渲染我的 map 集的“可见”部分而忽略隐藏的图 block ?我对此完全陌生。

我正在使用

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);
}

最佳答案

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

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

例如,只有当你想改变使用的纹理时,你才应该调用 glBindTexture。上面的代码在非常昂贵的内部循环中一遍又一遍地绑定(bind)相同的纹理。同样,您不需要在内部循环中启用和禁用纹理坐标和顶点数组。即使在内部循环中设置纹理坐标指针和顶点指针也是不必要的,因为它们在后续循环之间不会改变。

最重要的是,在内部循环中,您应该只更改翻译并调用 glDrawArrays。其他一切只会白白消耗资源。

您可以执行更高级的操作来进一步加快速度。可以绘制平铺背景,这样它只会调用一次 glDrawArrays(或 glDrawElements)。如果您有兴趣,您应该谷歌主题,如批处理和纹理图集。

关于android OpenGL ES simple Tile generator 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2129125/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com