我有两种用于渲染网格的方法。第一个:
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
循环之前声明Z
和for
以避免特别是声明和破坏sizeX
次Z
另外我猜,最好的方法是创建一个列表(一次,存储每次重复使用),所有节点按顺序遍历以创建网格,而不是使用两个for
答案 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和着色器!