【发布时间】:2013-11-29 04:01:55
【问题描述】:
我有两种用于渲染网格的方法。第一个:
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 中,我只是使用指针来获取值。在第二种方法中,每次我都必须相乘并添加一些东西。
但在运行时我并没有真正感觉到有什么不同。所以当我说第一个更好时我是对的吗?或者也许我选择的编译器比我更清楚,如何获得最好的......
如果我在 for 循环之前声明 X 和 Z 可能会更好一些,以避免特别是声明和销毁 sizeX 次 Z
另外我猜,最好的办法是创建一个列表(一次,存储的 ro 可以在每一帧重复使用),所有节点按顺序遍历以创建网格,而不是使用两个 for
【问题讨论】:
-
glVertex3f (...)far 的调用开销很有可能超过了您可以解决此问题的任何花哨的裤子指针算术技巧。像这样对即时模式进行微优化实际上没有任何意义,您应该切换到索引顶点数组并称之为更好地花费时间。但是,如果您坚持,如果您将glVertex3fv (... )加入其中以进行另一次微优化,您可以让这个噩梦持续更长时间。 -
@AndonM.Coleman 听起来不错,老实说我从来没有使用过顶点数组,所以当我写那个代码时我什至没有想到它。我在某本书中读到了一些关于它们的信息。明天我会在图书馆阅读更多相关内容
标签: c++ linux opengl optimization