gpt4 book ai didi

c++ - 提高那段代码的执行速度

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:54 24 4
gpt4 key购买 nike

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

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 循环之前声明 XZ 可能会更好一些,尤其是避免声明和销毁 sizeX Z 的倍数

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

最佳答案

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;

这不仅可以减少操作的数量,而且可以使节点之间的关系更加明显。我不知道您的编译器有多聪明,也不知道它是否能够自己进行这种优化。但是,当备选方案更加明确时,为什么必须这样做呢?

(这里是关于过早优化的强制性警告。如果您甚至没有注意到两者之间的区别,那么担心微优化还为时过早。)

关于c++ - 提高那段代码的执行速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20278178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com