From ccfe862f807be9da35e7a3b6c8fc746ff658a1c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20M=C3=B6bius?= Date: Fri, 28 Sep 2012 09:38:21 +0000 Subject: [PATCH] Minor speedup of McDecimater git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@711 fdac6126-5c0c-442c-9429-916003d36597 --- src/OpenMesh/Tools/Decimater/McDecimaterT.cc | 57 ++++++-------------- 1 file changed, 17 insertions(+), 40 deletions(-) diff --git a/src/OpenMesh/Tools/Decimater/McDecimaterT.cc b/src/OpenMesh/Tools/Decimater/McDecimaterT.cc index 95344f6b..adf82c58 100644 --- a/src/OpenMesh/Tools/Decimater/McDecimaterT.cc +++ b/src/OpenMesh/Tools/Decimater/McDecimaterT.cc @@ -59,9 +59,7 @@ #else # include #endif -#ifdef USE_OPENMP -#include -#endif + //== NAMESPACE =============================================================== @@ -127,9 +125,6 @@ size_t McDecimaterT::decimate(size_t _n_collapses) { double energy = FLT_MAX; // Generate random samples for collapses - #ifdef USE_OPENMP - #pragma omp parallel for private(energy,tmpHandle) shared(bestEnergy,bestHandle) - #endif for ( int i = 0; i < (int)randomSamples_; ++i) { // Random halfedge handle @@ -142,10 +137,6 @@ size_t McDecimaterT::decimate(size_t _n_collapses) { // Check if legal we analyze the priority of this collapse operation if (this->is_collapse_legal(ci)) { - #ifdef USE_OPENMP - #pragma omp critical(energyUpdate) - { - #endif energy = this->collapse_priority(ci); if (energy != ModBaseT::ILLEGAL_COLLAPSE) { @@ -155,9 +146,6 @@ size_t McDecimaterT::decimate(size_t _n_collapses) { bestHandle = tmpHandle; } } - #ifdef USE_OPENMP - } - #endif } else { continue; } @@ -217,6 +205,7 @@ size_t McDecimaterT::decimate(size_t _n_collapses) { template size_t McDecimaterT::decimate_to_faces(size_t _nv, size_t _nf) { + if (!this->is_initialized()) return 0; @@ -237,6 +226,7 @@ size_t McDecimaterT::decimate_to_faces(size_t _nv, size_t _nf) { unsigned int noCollapses = 0; while ((_nv < nv) && (_nf < nf)) { + if (noCollapses > 20) { omlog() << "[McDecimater] : no collapses performed in over 20 iterations in a row\n"; break; @@ -249,9 +239,6 @@ size_t McDecimaterT::decimate_to_faces(size_t _nv, size_t _nf) { double energy = FLT_MAX; // Generate random samples for collapses - #ifdef USE_OPENMP - #pragma omp parallel for private(energy,tmpHandle) shared(bestEnergy,bestHandle) - #endif for (int i = 0; i < (int) randomSamples_; ++i) { // Random halfedge handle @@ -264,10 +251,6 @@ size_t McDecimaterT::decimate_to_faces(size_t _nv, size_t _nf) { // Check if legal we analyze the priority of this collapse operation if (this->is_collapse_legal(ci)) { - #ifdef USE_OPENMP - #pragma omp critical(energyUpdate) - { - #endif energy = this->collapse_priority(ci); if (energy != ModBaseT::ILLEGAL_COLLAPSE) { @@ -277,9 +260,6 @@ size_t McDecimaterT::decimate_to_faces(size_t _nv, size_t _nf) { bestHandle = tmpHandle; } } - #ifdef USE_OPENMP - } - #endif } else { continue; } @@ -309,7 +289,6 @@ size_t McDecimaterT::decimate_to_faces(size_t _nv, size_t _nf) { else nf -= 2; - // pre-processing this->preprocess_collapse(ci); @@ -352,6 +331,7 @@ size_t McDecimaterT::decimate_to_faces(size_t _nv, size_t _nf) { template size_t McDecimaterT::decimate_constraints_only(float _factor) { + if (!this->is_initialized()) return 0; @@ -373,35 +353,31 @@ size_t McDecimaterT::decimate_constraints_only(float _factor) { // performed in a row unsigned int noCollapses = 0; + double energy = FLT_MAX; + double bestEnergy = FLT_MAX; - while ((noCollapses <= 20) && (illegalCollapses <= 10) && (nv > 0) && (nf > 1)) { + while ((noCollapses <= 50) && (illegalCollapses <= 50) && (nv > 0) && (nf > 1)) { // Optimal id and value will be collected during the random sampling typename Mesh::HalfedgeHandle bestHandle(-1); typename Mesh::HalfedgeHandle tmpHandle(-1); - double bestEnergy = FLT_MAX; - double energy = FLT_MAX; + bestEnergy = FLT_MAX; + + const double randomNormalizer = (1.0 / RAND_MAX) * (mesh_.n_halfedges() - 1); // Generate random samples for collapses - #ifdef USE_OPENMP - #pragma omp parallel for private(energy,tmpHandle) shared(bestEnergy,bestHandle) - #endif for (int i = 0; i < (int) randomSamples_; ++i) { // Random halfedge handle - tmpHandle = typename Mesh::HalfedgeHandle((static_cast(rand()) / RAND_MAX) * (mesh_.n_halfedges() - 1)); + tmpHandle = typename Mesh::HalfedgeHandle(int(rand() * randomNormalizer ) ); - // if it is not deleted, we analyse it - if (!mesh_.status(tmpHandle).deleted()) { + // if it is not deleted, we analyze it + if (!mesh_.status(mesh_.edge_handle(tmpHandle)).deleted()) { CollapseInfo ci(mesh_, tmpHandle); // Check if legal we analyze the priority of this collapse operation if (this->is_collapse_legal(ci)) { - #ifdef USE_OPENMP - #pragma omp critical(energyUpdate) - { - #endif energy = this->collapse_priority(ci); @@ -413,6 +389,7 @@ size_t McDecimaterT::decimate_constraints_only(float _factor) { lastCollapseIllegal = true; } } else { + illegalCollapses = 0; lastCollapseIllegal = false; @@ -422,16 +399,16 @@ size_t McDecimaterT::decimate_constraints_only(float _factor) { bestHandle = tmpHandle; } } - #ifdef USE_OPENMP - } - #endif } else { + continue; } } } + + // Found the best energy? if ( bestEnergy != FLT_MAX ) {