CGAL中Garland&Heckbert网格简化耗时过长问题咨询及优化求助
CGAL 三角网格简化耗时过长问题解答
耗时合理性判定
你当前的30分钟耗时完全不符合预期。针对10万面量级的三角网格,采用Garland&Heckbert二次误差简化算法压缩到原顶点数的20%,在正确编译配置下耗时通常在10秒以内,当前耗时属于明显异常。
可落地优化方案
- 最高优先级:切换到Release编译模式
CGAL基于大量模板实现,内置了非常多Debug断言检查,Debug模式下运行性能会比Release模式低100~1000倍,绝大多数同类耗时问题都是误用Debug模式编译导致的,优先排查该问题。 - 替换几何核配置
将当前使用的CGAL::Simple_cartesian<double>核替换为你注释掉的CGAL::Exact_predicates_inexact_constructions_kernel,该核的几何判断谓词经过专门优化,既保证计算正确性,也不会引入额外的运算开销。 - 简化策略调整
- 如无强制的法向变化约束,可移除
Bounded_normal_change_placement对GH放置策略的包装,该包装会在每次边坍缩前额外执行法向变化校验,会带来不小的性能损耗; - 如对简化精度要求不高,可直接换用计算量更低的边长成本+中点放置策略,性能可提升30%以上。
- 如无强制的法向变化约束,可移除
- 网格预处理优化
在执行简化前,先调用CGAL::Polygon_mesh_processing::remove_duplicates移除重复顶点、CGAL::Polygon_mesh_processing::triangulate_faces确保所有面都是三角面,干净的输入网格可以避免简化过程中额外的合法性校验开销。 - 编译选项优化
编译时开启最高等级优化:GCC/Clang添加-O3参数,MSVC添加/O2参数,同时定义CGAL_NO_ASSERTIONS宏关闭CGAL的运行时断言,可进一步提升运行性能。
修改后核心代码示例
// 替换核类型 typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Surface_mesh<K::Point_3> CGAL_Mesh; // 简化前添加预处理步骤 PMP::remove_duplicates(inital_mesh); PMP::triangulate_faces(inital_mesh); PMP::stitch_borders(inital_mesh); // 如有需要可缝合边界 // 移除Bounded_normal_change_placement包装,直接使用GH放置策略 int r = SMS::edge_collapse(inital_mesh, stop, CGAL::parameters::get_cost(gh_cost) .get_placement(gh_placement));
内容的提问来源于stack exchange,提问作者candice_chen
相关产品推荐
相关产品推荐

