我正在使用以下代码在3D游戏中绘制一些多边形网格物体。绘制多边形网格时发生Opengl性能问题
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不被允许了。
您似乎在研究如何在实际绘图函数中绘制网格,而不是预先绘制网格。我的意思是你的绘图函数应该只是传递已经构建的数组。所以这里的问题更多的是你如何管理模型工作流程。我会确保你有一个VBO和每个网格的索引缓冲区。然后,您将不必在绘图中间迭代网格。你只需在显卡上挑选三角形和指标的汤。 – Robinson
在ES 1.1中,您的选择非常有限。它是glDrawArrays和glDrawElements,就是这样。而且,PC架构与嵌入式设备有很大不同。具有x16 PCIe总线和NVIDIA板的降频CPU不太可能提供与PowerRV相同的性能。 – Calvin1602