2016-09-29 10 views
0

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

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 вершины. Я могу получить индекс каждой вершины, обращаясь к группе-> face-> uvindex.

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

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

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

+2

Вы должны перейти к конвертации стека codereview. вопрос больше подходит там – Hayt

+0

На какой платформе вы работаете? Какой компилятор и какие параметры компилятора вы используете? –

+1

С самого начала ... 'for (int i = 0; i erip

ответ

0

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

+0

К сожалению, значение равно двум поплавкам, поэтому я не могу назначить его как ключ. –

+0

Вы можете использовать float как ключ. Это не запрещено, это просто считается плохой практикой сравнивать поплавки для равенства. Но в вашем коде вы уже это делаете: 'groupList [group] [sib] -> uvs [vb] [0] == groupList [group] [si] -> uvs [v] [0]'. Поэтому std :: unordered_set будет эквивалентен вашему коду. Но если сравнение равенства не подходит, то идея ускорения остается прежней, но вам понадобится другой тип индекса. Что-то вроде дерева k-d, например. –