У меня есть два метода, используемых для рендеринга сетки. Первый из них:улучшение скорости выполнения этой части кода
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
Скорее всего, что накладные расходы на вызов 'glVertex3f (...)' *** far *** превосходят любые арифметические хаки-указатели для штанов, которые вы можете бросить на эту проблему. Существует буквально не смысл в микро-оптимизации немедленного режима, как это, вы должны переключиться на индексированные массивы вершин и назвать это время лучше потрачено. Но если вы настаиваете, вы можете сделать этот кошмар дольше, если вы выбросите 'glVertex3fv (... )' в микс для еще одной микро-оптимизации. –
@ AndonM.Coleman звучит неплохо, чтобы быть честным Я никогда не использовал массив вершин, поэтому даже не думал об этом, когда писал этот код. Я немного читал о них в какой-то книге. Я буду читать больше об этом в библиотеке tomorow –