【发布时间】:2016-09-29 10:51:23
【问题描述】:
我只是猜测这段代码是否还有提升性能的空间:
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个顶点我可以得到访问组的每个顶点的索引->面->uvindex。
actualUvIndex 是一个向量,用于管理每个顶点的索引。
显然我的意图是简化并将找到的第一个索引分配给冗余顶点,这意味着冗余的顶点共享存储在 uvs[][0] 和 uvs[][1] 中的位置,请注意,因为那是 uvs它们只有两个轴。
问候并感谢您提前提供任何提示。
【问题讨论】:
-
您应该前往 codereview stackexchange。这个问题更适合那里
-
您在哪个平台上运行?您使用的是什么编译器和编译器选项?
-
马上开始...
for (int i = 0; i < actualUvIndex.size(); i++) { actualUvIndex[i] = i; }这整个事情可以用std::iota 替换,编译器可能会更优化。顺便说一句,不要使用int来索引数组。 -
@Hayt 从未听说过,谢谢! AndrewHenle Win64 VisualStudio 2016 默认选项,但支持 OpenMP。 erip 谢谢你的提示!无论如何我认为这应该不是一个大问题,但瓶颈在于嵌套的fors。