我正在使用以下代码在 3D 游戏中绘制一些多边形网格。
void drawModelFace(const MeshFace *face, float *vertices, float *vertNormals, float *textureVerts)
{
glBegin(GL_POLYGON);
for (int i = 0; i < face->_numVertices; i++)
{
glNormal3fv(&vertNormals[3 * face->_vertices[i]]);
if (face->_texVertices)
{
glTexCoord2fv(&textureVerts[2 * face->_texVertices[i]]);
}
glVertex3fv(&vertices[3 * face->_vertices[i]]);
}
glEnd();
}
我的问题是,当这个函数被多次调用时,我在游戏中遇到了一些性能问题。
此函数平均每秒调用 50000 次,提供恒定的 60fps,但在某些地方,它被称为每秒 100000 次,提供 15fps。(我用今天的电脑降频到1Ghz来模拟今天手机的性能)
我听说即时模式可能很慢,这就是我尝试使用 glDrawArrays 的原因。这是代码:
void drawModelFace(const MeshFace *face, float *vertices, float *vertNormals, float *textureVerts)
{
GLfloat vert[3*face->_numVertices];
GLfloat normal[3*face->_numVertices];
GLfloat tex[2*face->_numVertices];
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vert);
glTexCoordPointer(2, GL_FLOAT, 0, tex);
glNormalPointer(GL_FLOAT, 0, normal);
for (int i = 0; i < face->_numVertices; i++)
{
vert[0 + (i*3)] = vertices[3 * face->_vertices[i]];
vert[1 + (i*3)] = vertices[3 * face->_vertices[i]+1];
vert[2 + (i*3)] = vertices[3 * face->_vertices[i]+2];
normal[0 + (i*3)] = vertNormals[3 * face->_vertices[i]];
normal[1 + (i*3)] = vertNormals[3 * face->_vertices[i]+1];
normal[2 + (i*3)] = vertNormals[3 * face->_vertices[i]+2];
if (face->_texVertices)
{
tex[0 + (i*2)] = textureVerts[2 * face->_texVertices[i]];
tex[1 + (i*2)] = textureVerts[2 * face->_texVertices[i]+1];
}
}
glDrawArrays(GL_TRIANGLE_FAN ,0, face->_numVertices);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
}
但是性能结果是完全一样的。
如何优化我的代码以获得一些 fps?
请注意,我的最终目标是将此代码用于 android 设备,因此不再允许 glBegin 和 glEnd 。