与えられた 3D メッシュがあり、同一の頂点を削除しようとしています。このために、頂点の座標と対応する法線を含む自己定義の構造体を使用しています。
struct vertice
{
float p1,p2,p3,n1,n2,n3;
bool operator == (const vertice& vert) const
{
return (p1 == vert.p1 && p2 == vert.p2 && p3 == vert.p3);
}
};
頂点をデータで満たした後、重複を削除するために unordered_set に追加されます。
struct hashVertice
{
size_t operator () (const vertice& vert) const
{
return(7*vert.p1 + 13*vert.p2 + 11*vert.p3);
}
};
std::unordered_set<vertice,hashVertice> verticesSet;
vertice vert;
while(i<(scene->mMeshes[0]->mNumVertices)){
vert.p1 = (float)scene->mMeshes[0]->mVertices[i].x;
vert.p2 = (float)scene->mMeshes[0]->mVertices[i].y;
vert.p3 = (float)scene->mMeshes[0]->mVertices[i].z;
vert.n1 = (float)scene->mMeshes[0]->mNormals[i].x;
vert.n2 = (float)scene->mMeshes[0]->mNormals[i].y;
vert.n3 = (float)scene->mMeshes[0]->mNormals[i].z;
verticesSet.insert(vert);
i = i+1;
}
3.000.000 頂点のようなデータ量には遅すぎることがわかりました。プログラムを 15 分間実行した後でも、プログラムは終了しませんでした。見えないボトルネックはありますか、それともそのようなタスクに適した別のデータ構造はありますか?