우리는 주어진 3D 메시를 가지고 있으며 동일한 꼭지점을 제거하려고합니다. 이를 위해 정점 좌표와 해당 법선이 포함 된 자체 정의 구조체를 사용합니다.unordered_set 채우기가 너무 느림
데이터로 버텍스를 채우면 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 분간의 실행 후에도 프로그램이 끝나지 않았습니다. 우리가 보지 못하는 병목 현상이 있습니까? 아니면 그러한 작업을 위해 다른 데이터 구조가 더 좋습니까?
p1, p2, p3 값이 모두 작은 경우 해시 함수는 모든 점에 대해 거의 제로 값을 반환하며 성능이 매우 느립니다. – interjay
표준 해싱을 사용하게하려고 했습니까? 더 빠르거나 느린가요? –
확실한 질문 ... 컴파일러에서 최적화를 활성화 했습니까? –