From: kgv Date: Wed, 8 Apr 2020 07:22:26 +0000 (+0300) Subject: 0031490: Foundation Classes, Poly_Connect - speed up temporary allocations X-Git-Tag: V7_5_0_beta~230 X-Git-Url: http://git.dev.opencascade.org/gitweb/?p=occt.git;a=commitdiff_plain;h=8f08e231fa088f7a0a57a3ae143884bb3228fe41;hp=f0ada3e8d443fd00d0f6d663868abcd8fb443d4a 0031490: Foundation Classes, Poly_Connect - speed up temporary allocations Poly_Connect::Load() now uses NCollection_IncAllocator instead of new/delete for allocation temporary sequence elements. StdPrs_ShadedShape, fillFaceBoundaries() now uses NCollection_IncAllocator for temporary points. --- diff --git a/src/Poly/Poly_Connect.cxx b/src/Poly/Poly_Connect.cxx index 14a8bf747d..f1200515c8 100644 --- a/src/Poly/Poly_Connect.cxx +++ b/src/Poly/Poly_Connect.cxx @@ -16,6 +16,7 @@ #include +#include #include #include @@ -23,9 +24,9 @@ struct polyedge { polyedge* next; // the next edge in the list - Standard_Integer nd; // the second node of the edge Standard_Integer nt[2]; // the two adjacent triangles Standard_Integer nn[2]; // the two adjacent nodes + Standard_Integer nd; // the second node of the edge DEFINE_STANDARD_ALLOC }; @@ -97,6 +98,8 @@ void Poly_Connect::Load (const Handle(Poly_Triangulation)& theTriangulation) // create an array to store the edges starting from the vertices NCollection_Array1 anEdges (1, aNbNodes); anEdges.Init (NULL); + // use incremental allocator for small allocations + Handle(NCollection_IncAllocator) anIncAlloc = new NCollection_IncAllocator(); // loop on the triangles NCollection_Vec3 aTriNodes; @@ -144,7 +147,7 @@ void Poly_Connect::Load (const Handle(Poly_Triangulation)& theTriangulation) if (ced == NULL) { // create the edge if not found - ced = new polyedge(); + ced = (polyedge* )anIncAlloc->Allocate (sizeof(polyedge)); ced->next = anEdges[anEdgeNodes[0]]; anEdges[anEdgeNodes[0]] = ced; ced->nd = anEdgeNodes[1]; @@ -196,16 +199,16 @@ void Poly_Connect::Load (const Handle(Poly_Triangulation)& theTriangulation) anAdjIndex += 3; } - // destroy the edges array - for (Standard_Integer aNodeIter = anEdges.Lower(); aNodeIter <= anEdges.Upper(); ++aNodeIter) + // destroy the edges array - can be skipped when using NCollection_IncAllocator + /*for (Standard_Integer aNodeIter = anEdges.Lower(); aNodeIter <= anEdges.Upper(); ++aNodeIter) { for (polyedge* anEdgeIter = anEdges[aNodeIter]; anEdgeIter != NULL;) { polyedge* aTmp = anEdgeIter->next; - delete anEdgeIter; + anIncAlloc->Free (anEdgeIter); anEdgeIter = aTmp; } - } + }*/ } //======================================================================= diff --git a/src/StdPrs/StdPrs_ShadedShape.cxx b/src/StdPrs/StdPrs_ShadedShape.cxx index 69bf604cc3..ca30cd58ac 100644 --- a/src/StdPrs/StdPrs_ShadedShape.cxx +++ b/src/StdPrs/StdPrs_ShadedShape.cxx @@ -28,7 +28,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -312,14 +314,20 @@ namespace Standard_Integer aNbPolylines = 0; TopLoc_Location aTrsf; - TColgp_SequenceOfPnt aSeqPntsExtra; + + Handle(NCollection_Shared) aSeqPntsExtra; for (TopExp_Explorer aFaceIter (theShape, TopAbs_FACE); aFaceIter.More(); aFaceIter.Next()) { const TopoDS_Face& aFace = TopoDS::Face (aFaceIter.Current()); if (aFace.NbChildren() == 0) { // handle specifically faces without boundary definition (triangulation-only) - StdPrs_WFShape::AddEdgesOnTriangulation (aSeqPntsExtra, aFace, Standard_False); + if (aSeqPntsExtra.IsNull()) + { + Handle(NCollection_IncAllocator) anIncAlloc = new NCollection_IncAllocator(); + aSeqPntsExtra = new NCollection_Shared (anIncAlloc); + } + StdPrs_WFShape::AddEdgesOnTriangulation (*aSeqPntsExtra, aFace, Standard_False); } } @@ -358,26 +366,25 @@ namespace ++aNbPolylines; } } + const Standard_Integer aNbExtra = !aSeqPntsExtra.IsNull() ? aSeqPntsExtra->Size() : 0; if (aNodeNumber == 0) { - if (aSeqPntsExtra.Size() < 2) + if (aNbExtra < 2) { return Handle(Graphic3d_ArrayOfSegments)(); } - Standard_Integer aNbVertices = aSeqPntsExtra.Size(); - Handle(Graphic3d_ArrayOfSegments) aSegments = new Graphic3d_ArrayOfSegments (aNbVertices); - for (Standard_Integer aPntIter = 1; aPntIter <= aNbVertices; aPntIter += 2) + Handle(Graphic3d_ArrayOfSegments) aSegments = new Graphic3d_ArrayOfSegments (aNbExtra); + for (TColgp_SequenceOfPnt::Iterator aPntIter (*aSeqPntsExtra); aPntIter.More(); aPntIter.Next()) { - aSegments->AddVertex (aSeqPntsExtra.Value (aPntIter)); - aSegments->AddVertex (aSeqPntsExtra.Value (aPntIter + 1)); + aSegments->AddVertex (aPntIter.Value()); } return aSegments; } // create indexed segments array to pack polylines from different edges into single array const Standard_Integer aSegmentEdgeNb = (aNodeNumber - aNbPolylines) * 2; - Handle(Graphic3d_ArrayOfSegments) aSegments = new Graphic3d_ArrayOfSegments (aNodeNumber + aSeqPntsExtra.Size(), aSegmentEdgeNb + aSeqPntsExtra.Size()); + Handle(Graphic3d_ArrayOfSegments) aSegments = new Graphic3d_ArrayOfSegments (aNodeNumber + aNbExtra, aSegmentEdgeNb + aNbExtra); for (TopTools_IndexedDataMapOfShapeListOfShape::Iterator anEdgeIter (anEdgesMap); anEdgeIter.More(); anEdgeIter.Next()) { if (anEdgeIter.Value().Extent() == 0) @@ -433,14 +440,12 @@ namespace } } + if (!aSeqPntsExtra.IsNull()) { Standard_Integer aSegmentEdge = aSegments->VertexNumber(); - const Standard_Integer aNbVertices = aSeqPntsExtra.Size(); - for (Standard_Integer aPntIter = 1; aPntIter <= aNbVertices; aPntIter += 2) + for (TColgp_SequenceOfPnt::Iterator aPntIter (*aSeqPntsExtra); aPntIter.More(); aPntIter.Next()) { - aSegments->AddVertex (aSeqPntsExtra.Value (aPntIter)); - aSegments->AddEdge (++aSegmentEdge); - aSegments->AddVertex (aSeqPntsExtra.Value (aPntIter + 1)); + aSegments->AddVertex (aPntIter.Value()); aSegments->AddEdge (++aSegmentEdge); } }