From 6662fe631302480b96c7e8a0b38fc9c45d27b0e0 Mon Sep 17 00:00:00 2001 From: abv Date: Sun, 29 Jan 2017 23:23:49 +0300 Subject: [PATCH] 0028404: DRAW - avoid useless preparation of display data when shape is not shown Class DBRep_DrawableShape is changed to postpone generation of display data until the shape is actually displayed (for the first time). Test perf draw bug28404 is added. --- src/DBRep/DBRep_DrawableShape.cxx | 19 ++++++++-------- src/DBRep/DBRep_DrawableShape.hxx | 17 +++++++------- tests/perf/draw/bug28404 | 38 +++++++++++++++++++++++++++++++ tests/perf/grids.list | 3 ++- 4 files changed, 58 insertions(+), 19 deletions(-) create mode 100644 tests/perf/draw/bug28404 diff --git a/src/DBRep/DBRep_DrawableShape.cxx b/src/DBRep/DBRep_DrawableShape.cxx index 3da810e721..05581002c9 100644 --- a/src/DBRep/DBRep_DrawableShape.cxx +++ b/src/DBRep/DBRep_DrawableShape.cxx @@ -104,18 +104,16 @@ DBRep_DrawableShape::DBRep_DrawableShape myRgN(Standard_False), myHid(Standard_False) { - Set(aShape); + myShape = aShape; } //======================================================================= -//function : Set +//function : updateDisplayData //purpose : //======================================================================= -void DBRep_DrawableShape::Set(const TopoDS_Shape& aShape) +void DBRep_DrawableShape::updateDisplayData () const { - myShape = aShape; - myFaces.Clear(); myEdges.Clear(); @@ -154,7 +152,7 @@ void DBRep_DrawableShape::Set(const TopoDS_Shape& aShape) //============================================================== TopTools_IndexedDataMapOfShapeListOfShape edgemap; - TopExp::MapShapesAndAncestors(aShape,TopAbs_EDGE,TopAbs_FACE,edgemap); + TopExp::MapShapesAndAncestors(myShape,TopAbs_EDGE,TopAbs_FACE,edgemap); Standard_Integer iedge; for (iedge = 1; iedge <= edgemap.Extent(); iedge++) { @@ -358,6 +356,9 @@ void DBRep_DrawableShape::DrawOn(Draw_Display& dis) const return; } + if (myFaces.IsEmpty() || myEdges.IsEmpty()) + updateDisplayData(); + // hidden lines if (myHLR) { DBRep_DrawableShape* p = (DBRep_DrawableShape*) this; @@ -610,7 +611,7 @@ void DBRep_DrawableShape::DrawOn(Draw_Display& dis) const if (aSurf.IsNull() || mytriangulations) { Tr = BRep_Tool::Triangulation(F->Face(), loc); if (!Tr.IsNull()) { - Display(Tr, loc.Transformation(), dis); + display(Tr, loc.Transformation(), dis); } } itf.Next(); @@ -1093,11 +1094,11 @@ void DBRep_DrawableShape::LastPick(TopoDS_Shape& s, //======================================================================= -//function : Display +//function : display //purpose : //======================================================================= -void DBRep_DrawableShape::Display(const Handle(Poly_Triangulation)& T, +void DBRep_DrawableShape::display(const Handle(Poly_Triangulation)& T, const gp_Trsf& tr, Draw_Display& dis) const { diff --git a/src/DBRep/DBRep_DrawableShape.hxx b/src/DBRep/DBRep_DrawableShape.hxx index d4d4c5f0cc..cc7b487410 100644 --- a/src/DBRep/DBRep_DrawableShape.hxx +++ b/src/DBRep/DBRep_DrawableShape.hxx @@ -53,8 +53,6 @@ public: Standard_EXPORT DBRep_DrawableShape(const TopoDS_Shape& C, const Draw_Color& FreeCol, const Draw_Color& ConnCol, const Draw_Color& EdgeCol, const Draw_Color& IsosCol, const Standard_Real size, const Standard_Integer nbisos, const Standard_Integer discret); - Standard_EXPORT void Set (const TopoDS_Shape& C); - //! Changes the number of isoparametric curves in a shape. Standard_EXPORT void ChangeNbIsos (const Standard_Integer NbIsos); @@ -113,20 +111,21 @@ public: DEFINE_STANDARD_RTTIEXT(DBRep_DrawableShape,Draw_Drawable3D) -protected: - +private: + void display (const Handle(Poly_Triangulation)& T, const gp_Trsf& tr, Draw_Display& dis) const; + //! Updates internal data necessary for display + void updateDisplayData () const; private: - - Standard_EXPORT void Display (const Handle(Poly_Triangulation)& T, const gp_Trsf& tr, Draw_Display& dis) const; - TopoDS_Shape myShape; - DBRep_ListOfEdge myEdges; - DBRep_ListOfFace myFaces; + + mutable DBRep_ListOfEdge myEdges; + mutable DBRep_ListOfFace myFaces; DBRep_ListOfHideData myHidData; + Standard_Real mySize; Standard_Integer myDiscret; Draw_Color myFreeCol; diff --git a/tests/perf/draw/bug28404 b/tests/perf/draw/bug28404 new file mode 100644 index 0000000000..b60236efdf --- /dev/null +++ b/tests/perf/draw/bug28404 @@ -0,0 +1,38 @@ +puts "0028404: DRAW is slow" + +# Test performance of code generating deep nested compound +# involving simple shape (box) around 93 K times + +pload MODELING + +# replicate shape nb times, adding rotation and translation to each copy +# (except first) +proc replicate {result shape nb cx cy cz rx ry rz angle tx ty tz} { + upvar $result res + upvar $shape s + + copy s a0 + set ll a0 + for {set i 1} {$i < $nb} {incr i} { + copy "a[expr $i - 1]" a$i + trotate a$i $cx $cy $cz $rx $ry $rz $angle + ttranslate a$i $tx $ty $tz + lappend ll a$i + } + eval compound $ll res + return $result +} + +# switch off autodisplay of shapes +autodisplay 0 + +chrono s restart +box b 10 10 10 +replicate r1 b 12 0 0 0 0 0 1 30 15 20 3 +replicate r2 r1 36 50 -50 0 1 1 0 10 0 0 0 +replicate r3 r2 18 250 250 0 1 -1 0 20 100 100 20 +replicate r4 r3 12 -300 -300 0 0 0 1 30 300 300 0 +chrono s stop counter "huge compound generation CPU" + +# return autodisplay +autodisplay 1 diff --git a/tests/perf/grids.list b/tests/perf/grids.list index aa8ed78e0d..d4e3626111 100644 --- a/tests/perf/grids.list +++ b/tests/perf/grids.list @@ -9,4 +9,5 @@ 009 modalg 010 moddata 011 sewing -012 vis \ No newline at end of file +012 vis +013 draw -- 2.20.1