我只是猜测是否有提高此代码性能的空间:
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;
}
}
}
}
}
}
}
让我解释一下: 我的几何体(是的,它是关于3d网格)分组,因此隔离每一个都是有道理的。
每个组包含面和每个面3个顶点我可以获得访问组的每个顶点的索引 - &gt; face-&gt; uvindex。
actualUvIndex是一个管理每个顶点索引的向量。
显然我的意图是简化并分配找到冗余顶点的第一个索引,这意味着冗余共享其位置的顶点存储在uvs [] [0]和uvs [] [1]中,请注意,因为那是uvs他们只有两个轴。
关心并感谢您提前获取任何提示。
答案 0 :(得分:0)
您可以使用索引搜索重复的顶点来加速代码。为顶点定义一个has函数,然后迭代顶点并将它们放入std :: unordered映射中,使用vertice作为键,索引作为值。放置它时,检查该键是否已有值:如果有,请使用映射中的索引。这样复杂性将是o(顶点数)。