绘制多边形网格时出现 Opengl 性能问题
Opengl performance issue when drawing polygon meshes
我使用以下代码在 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的电脑来模拟今天手机的性能)
我听说即时模式可能很慢,这就是我尝试使用 glDrawArray 的原因。代码如下:
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?
请注意,我的最终目标是在安卓设备上使用此代码,因此不再允许glBegin和glEnd。
我认为glDrawArray可能是最好的选择。如果我没记错的话,数组中的数据将在每次迭代中从客户端发送到服务器。如果数据在每次迭代中都发生了变化,那么这不是真正的问题,因为客户端每次更改数据时都需要将数据发送到服务器。这意味着由于 VBO 的实现,在服务器内存上存储大量数据不会真正为您带来任何性能提升,因为您无论如何都必须重新发送该数据。
您使用的是大物体还是许多小物体?我相当有信心glDrawArrays在大型对象的情况下是最佳的。
"性能结果完全相同"到底是什么意思? 是非常非常相似还是有什么区别?对我来说,如果性能完全相同,这听起来有点可疑。
如果您的网格没有改变(即它是一个静态模型),那么您可以使用显示列表
这允许您将所有顶点/纹理/普通调用预先组合到一个列表中,然后通过对 glCallList 的单个函数调用来渲染该列表。
相关文章:
- Qt OpenGL 渲染到纹理性能问题
- OpenGL ES:在顶点着色器中计算顶点位置时性能不佳
- 使用OpenGL绘制更多对象时,性能会降低
- 使用 OpenGL 窗口(如 GLFW)或周围的窗口(如 GTK 或 SDL)是否存在性能差异?
- OpenGL:在帧中回收帧缓冲会损害性能吗?
- 随着时间的推移,openGL性能降解的可能原因
- OpenGL:MESA3D屏幕上的软件渲染性能问题
- 全局变量的顺序会改变C /OpenGL的性能
- 绘制多边形网格时出现 Opengl 性能问题
- 从 NASA 数据渲染地形时的 Opengl 性能问题
- 在OpenGL中为顶点、uvs和法线使用一个缓冲区是否比使用三个缓冲区性能更好
- Opengl性能问题,
- OpenGL中仅限Android的游戏:C++(NDK)与Java(Dalvik)的性能
- Opengl 2D性能提示
- SDL软件渲染与OpenGL:兼容性和性能
- OpenGL在我的计算机上性能低下
- WebGL和OpenGL的性能
- 使用OpenGL的性能水平较低
- 移动设备上的OpenGL矢量图形渲染性能
- OpenGL中即时模式的性能问题