提高执行该段代码的速度

时间:2013-11-29 04:01:56

标签: c++ linux opengl optimization

我有两种用于渲染网格的方法。第一个:

void Grid::openglRender(){
  glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
  glBegin(GL_TRIANGLES);
  glColor3f(1.0f, 1.0f, 0.0f);
  Node* A, * B, * C, * D;
  for(size_t X=0 ; X<sizeX-1 ; X++)for(size_t Z=0 ; Z<sizeZ-1; Z++){
    A = &nodes[X*sizeZ+Z];
    B = &nodes[(X+1)*sizeZ+Z];
    C = &nodes[X*sizeZ+(Z+1)];
    D = &nodes[(X+1)*sizeZ+(Z+1)];
    glVertex3f(A->x, A->y, A->z);
    glVertex3f(B->x, B->y, B->z);
    glVertex3f(C->x, C->y, C->z);

    glVertex3f(B->x, B->y, B->z);
    glVertex3f(D->x, D->y, D->z);
    glVertex3f(C->x, C->y, C->z);
  }
  glEnd();
};

第二个:

void Grid::openglRender(){
  glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
  glBegin(GL_TRIANGLES);
  glColor3f(1.0f, 1.0f, 0.0f);
  for(size_t X=0 ; X<sizeX-1 ; X++)for(size_t Z=0 ; Z<sizeZ-1; Z++){
    glVertex3f(nodes[X*sizeZ+Z].x, nodes[X*sizeZ+Z].y, nodes[X*sizeZ+Z].z);
    glVertex3f(nodes[(X+1)*sizeZ+Z].x, nodes[(X+1)*sizeZ+Z].y, nodes[(X+1)*sizeZ+Z].z);
    glVertex3f(nodes[X*sizeZ+(Z+1)].x, nodes[X*sizeZ+(Z+1)].y, nodes[X*sizeZ+(Z+1)].z);

    glVertex3f(nodes[(X+1)*sizeZ+Z].x, nodes[(X+1)*sizeZ+Z].y, nodes[(X+1)*sizeZ+Z].z);
    glVertex3f(nodes[(X+1)*sizeZ+(Z+1)].x, nodes[(X+1)*sizeZ+(Z+1)].y, nodes[(X+1)*sizeZ+(Z+1)].z);
    glVertex3f(nodes[X*sizeZ+(Z+1)].x, nodes[X*sizeZ+(Z+1)].y, nodes[X*sizeZ+(Z+1)].z);
  }
  glEnd();
};

对我来说,第一个在操作次数方面看起来更好,在glVertex3f我只是使用指针来获取值。在第二种方法中,每次我必须乘以并添加一些东西。

但是在运行时我并不觉得有所不同。所以当我说第一个更好的时候我是对的?或者也许我选择的任何东西,编译器比我知道的更好,如何做到最好......

如果我在X循环之前声明Zfor以避免特别是声明和破坏sizeX次Z

另外我猜,最好的方法是创建一个列表(一次,存储每次重复使用),所有节点按顺序遍历以创建网格,而不是使用两个for

3 个答案:

答案 0 :(得分:1)

A = &nodes[X*sizeZ+Z];
B = &nodes[(X+1)*sizeZ+Z];
C = &nodes[X*sizeZ+(Z+1)];
D = &nodes[(X+1)*sizeZ+(Z+1)];

可能是

A = &nodes[X * sizeZ + Z];
B = A + sizeZ;
C = A + 1;
D = B + 1;

这不仅应该减少操作次数,而且还会使节点的关系更加明显。我不知道你的编译器有多聪明,以及它是否能够自己进行这种优化。但是,当替代方案更清楚时,为什么要这样做?

(关于过早优化的强制性警告。如果你甚至没有注意到两者之间的差异,那么现在就担心微观优化还为时过早。)

答案 1 :(得分:0)

仅仅因为优化一段代码并不总是意味着您将看到更好的运行时性能。您如何衡量运行时性能?根据两个for循环中的迭代次数,除非迭代次数足够多,否则您可能看不到任何差异。 sizeX和sizeZ的实际值是多少?

答案 2 :(得分:0)

这些调用已被弃用,这是程序运行缓慢的一个原因。你应该看看VBO和着色器!