Я просто догадываюсь, есть ли место для улучшения производительности в этом коде:
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, они имеют только две оси
С уважением и спасибо заранее за любой совет.
Вы можете ускорить свой код, используя индексы для поиска дублированных вершин. Определите функцию has для вашей вершины, затем выполните итерации по вершинам и поместите их в карту std :: unordered с использованием вершины в качестве ключа и индекса в качестве значения. Когда вы поставите его, проверьте, есть ли уже значение для этого ключа: если оно есть, используйте индекс из карты. Таким образом, сложность будет o (число вершин).
Других решений пока нет …