From c6b7908499ae33adca68b25d8b11b59ba581379c Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 19 Aug 2023 01:55:04 +0200 Subject: [PATCH] Triangles: Memory optimization --- src/db/db/dbTriangle.h | 3 ++- src/db/db/dbTriangles.cc | 29 +++++++++++++++++++++-------- src/db/db/dbTriangles.h | 5 +++-- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/db/db/dbTriangle.h b/src/db/db/dbTriangle.h index d2966509d..20afe1097 100644 --- a/src/db/db/dbTriangle.h +++ b/src/db/db/dbTriangle.h @@ -30,6 +30,7 @@ #include "dbEdge.h" #include "tlObjectCollection.h" +#include "tlList.h" namespace db { @@ -428,7 +429,7 @@ struct TriangleEdgeLessFunc * @brief A class representing a triangle */ class DB_PUBLIC Triangle - : public tl::Object + : public tl::list_node, public tl::Object { public: Triangle (); diff --git a/src/db/db/dbTriangles.cc b/src/db/db/dbTriangles.cc index 11f713abf..0e717923e 100644 --- a/src/db/db/dbTriangles.cc +++ b/src/db/db/dbTriangles.cc @@ -42,7 +42,7 @@ Triangles::Triangles () Triangles::~Triangles () { while (! mp_triangles.empty ()) { - remove (mp_triangles.front ()); + remove (mp_triangles.begin ().operator-> ()); } } @@ -63,10 +63,20 @@ Triangles::create_vertex (const db::DPoint &pt) db::TriangleEdge * Triangles::create_edge (db::Vertex *v1, db::Vertex *v2) { - m_edges_heap.push_back (db::TriangleEdge (v1, v2)); - m_edges_heap.back ().link (); - m_edges_heap.back ().set_id (++m_id); - return &m_edges_heap.back (); + db::TriangleEdge *edge = 0; + + if (! m_returned_edges.empty ()) { + edge = m_returned_edges.back (); + m_returned_edges.pop_back (); + *edge = db::TriangleEdge (v1, v2); + } else { + m_edges_heap.push_back (db::TriangleEdge (v1, v2)); + edge = &m_edges_heap.back (); + } + + edge->link (); + edge->set_id (++m_id); + return edge; } db::Triangle * @@ -90,8 +100,10 @@ Triangles::remove (db::Triangle *tri) // clean up edges we do no longer need for (int i = 0; i < 3; ++i) { - if (edges [i] && edges [i]->left () == 0 && edges [i]->right () == 0) { - edges [i]->unlink (); + db::TriangleEdge *e = edges [i]; + if (e && e->left () == 0 && e->right () == 0 && e->v1 ()) { + e->unlink (); + m_returned_edges.push_back (e); } } } @@ -392,7 +404,7 @@ Triangles::find_closest_edge (const db::DPoint &p, db::Vertex *vstart, bool insi // A sample heuristics that takes a sqrt(N) sample from the // vertexes to find a good starting point - vstart = mp_triangles.front ()->vertex (0); + vstart = mp_triangles.begin ()->vertex (0); double dmin = vstart->distance (p); while (ls * ls < m) { @@ -1381,6 +1393,7 @@ Triangles::clear () m_edges_heap.clear (); mp_triangles.clear (); m_vertex_heap.clear (); + m_returned_edges.clear (); m_is_constrained = false; m_level = 0; m_id = 0; diff --git a/src/db/db/dbTriangles.h b/src/db/db/dbTriangles.h index bb085fbd8..c0271b635 100644 --- a/src/db/db/dbTriangles.h +++ b/src/db/db/dbTriangles.h @@ -77,7 +77,7 @@ public: int base_verbosity; }; - typedef tl::shared_collection triangles_type; + typedef tl::list triangles_type; typedef triangles_type::const_iterator triangle_iterator; Triangles (); @@ -252,8 +252,9 @@ public: std::vector find_inside_circle (const db::DPoint ¢er, double radius) const; private: - tl::shared_collection mp_triangles; + tl::list mp_triangles; tl::stable_vector m_edges_heap; + std::vector m_returned_edges; tl::stable_vector m_vertex_heap; bool m_is_constrained; size_t m_level;