0

我正在尝试通过应用程序获得至少 120 fps,但它目前位于 30 fps 左右。如果我删除我的球体创建方法,fps 会变为 120。

我的 sphere 方法检查每个球体以查看它是否超出范围。使用结构并没有提高性能。

 xc = x coord
 yc = y coord
 zc = y coord
 xd = x direction
 yd = y direction
 zd = z direction

有什么办法可以大幅度提高效率吗?

这段代码被称为每一帧。

void createSpheres()
{
     for(int i = 0; i < spheres.size(); i+=6)
    {
         xc = spheres[i];
         yc = spheres[i+1];
         zc = spheres[i+2];
         xd = spheres[i+3];
         yd = spheres[i+4];
         zd = spheres[i+5];


                 if((xc+xd)>= 45 || (xc+xd)<= -45)
                 {
                              xd = 0-xd;
                 }
                 if((yc+yd)>= 9.5 || (yc+yd)<= -9.5)
                 {
                              yd = 0-yd;
                 }
                 if((zc+zd)>= 45 || (zc+zd)<= -45)
                 {
                              zd = 0-zd;
                 }
                 glEnable(GL_TEXTURE_2D);
                 glBindTexture ( GL_TEXTURE_2D, texture_id[6] );
                 glPushMatrix();
                 glTranslatef( xc+(xd/10), yc+(yd/10), zc+(zd/10));   
                 glRotatef( -80,1,0,0); 
                 glScalef( 0.10f, 0.10f, 0.10f); 
                 gluQuadricTexture(quadric,1);
                 gluSphere(quadric,10.0,72,72); 
                 glPopMatrix();
                 glDisable(GL_TEXTURE_2D);
                 spheres[i] = xc+(xd/10);
                 spheres[i+1] = yc+(yd/10);
                 spheres[i+2] = zc+(zd/10);
                 spheres[i+3] = xd;
                 spheres[i+4] = yd;
                 spheres[i+5] = zd;  

    }
}
4

1 回答 1

1

不要使用旧的固定功能管道,为每个球体的顶点属性创建 VAO 和 VBO(http://www.opengl.org/wiki/Vertex_Specification)。

编辑:(添加了有关 VBO 和 VAO 的更多基础知识)当您在没有 VBO 的情况下进行渲染时,每次渲染一帧时都会发送几何数据。使用 VBO 可以将模型数据发送到显卡,然后在没有 cpu-gpu 瓶颈的情况下进行渲染。

glGenBuffers(1, &vboHandle);            // create vbo
glBindBuffer(target, vboHandle);        // bind vbo
glBufferData(target, size, data, usage); // send vertex data (position, normals, ..)

那么你必须在你的 VBO 数据和着色器属性之间建立连接

// get location of the in-attribute of the shader program
vertexLocation = glGetAttribLocation(programHandle,"vertex");
// activate desired VBO
glBindBuffer(GL_ARRAY_BUFFER, vboHandle);
// set attribute-pointer
glVertexAttribPointer(vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
// finally enable attribute-array
glEnableVertexAttribArray(vertexLocation);

VAO 用于组织您的 VBO - 通常您会遇到以下问题:

enable vertex attrib1
enable vertex attrib2
enable vertex attrib3

renderModel

disable vertex attrib1
disable vertex attrib2
disable vertex attrib3

使用 VAO,您可以减少代码工作量

enable VAO

renderModel

disable VAO

所以一个组合的代码片段可能看起来像:

// Create and bind VAO
glGenVertexArrays(1, &vaoId); 
glBindVertexArray(vaoId);

// create and bind vbo
glGenBuffers(1, &vboId); 
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);

GLint loc = glGetAttribLocation(programHandle, "attrib1");
glEnableVertexAttribArray(loc);
glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, 0);
// other vbos, attrib pointers
...
// UnbindVAO
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);

这可能是您需要的最少信息量,我建议您阅读 opengl Superbible 第 5 版的第 8 章和第 12 章。

于 2013-05-21T15:40:50.017 回答