Есть ли какое-либо ускорение для этого кода?

Я просто догадываюсь, есть ли место для улучшения производительности в этом коде:

std::vector<int>actualUvIndex(polyCount * 3, 0);
for (int i = 0; i < actualUvIndex.size(); i++)
{
actualUvIndex[i] = i;
}

#pragma omp parallel for schedule(dynamic)
for (int group = 0; group < groupList.size(); group++)
{
//take care per group only
for (int si = 0; si < groupList[group].size(); si++)
{
//take care per vertex
for (int v = 0; v < 3; v++)
{
int externalindex = groupList[group][si]->uvindex[v];

//if it has been changed forget about it
if (actualUvIndex[externalindex] == externalindex)
{
//compare with the rest of faces inside the group
for (int sib = si + 1; sib < groupList[group].size(); sib++)
{
for (int vb = 0; vb < 3; vb++)
{
int internalindex = groupList[group][sib]->uvindex[vb];
//if it has been changed forget about it
if (actualUvIndex[internalindex] == internalindex)
{
//if both uv vertex are equal just assign the same vertex index
if (groupList[group][sib]->uvs[vb][0] == groupList[group][si]->uvs[v][0] && groupList[group][sib]->uvs[vb][1] == groupList[group][si]->uvs[v][1])
actualUvIndex[internalindex] = externalindex;
}

}
}
}
}
}
}

Позвольте мне объяснить это немного:
Моя геометрия (да, она касается трехмерных сеток) разделена на группы, поэтому имеет смысл изолировать каждую из них.

Каждая группа содержит грани, и у каждой грани есть 3 вершины. Я могу получить индекс каждой вершины, обращающейся к group-> face-> uvindex.

actualUvIndex — это вектор для управления индексом каждой вершины.

Очевидно, что я намерен упростить и назначить первый найденный индекс избыточной вершине, что означает избыточность вершины, которая разделяет их позицию, которая хранится в uvs [] [0] и uvs [] [1], обратите внимание, что, поскольку это uvs, они имеют только две оси

С уважением и спасибо заранее за любой совет.

0

Решение

Вы можете ускорить свой код, используя индексы для поиска дублированных вершин. Определите функцию has для вашей вершины, затем выполните итерации по вершинам и поместите их в карту std :: unordered с использованием вершины в качестве ключа и индекса в качестве значения. Когда вы поставите его, проверьте, есть ли уже значение для этого ключа: если оно есть, используйте индекс из карты. Таким образом, сложность будет o (число вершин).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]