Hi, during profiling my program I found out that there's a lot of memory (de)allocation going on in OverlayNode::cut().
So instead creating inner-loop variables 'distances' and 'newVertices' every time, I moved the creation out of the loop and just do a clear() + reserve() inside the loop. This allows std::vector<> to reuse the old memory instead allocating new when the new size <= oldsize. Christian Ehrlicher
--- OverlayNode.cpp.orig 2009-11-22 10:43:58.000000000 +0100
+++ OverlayNode.cpp 2009-11-22 10:40:06.000000000 +0100
@@ -66,6 +66,7 @@
Face& face = createFace();
face.name = "left";
face.plane.set(1.0,0.0,0.0,1.0);
+ face.vertices.reserve(4);
face.vertices.push_back(v000);
face.vertices.push_back(v001);
face.vertices.push_back(v011);
@@ -76,6 +77,7 @@
Face& face = createFace();
face.name = "right";
face.plane.set(-1.0,0.0,0.0,1.0);
+ face.vertices.reserve(4);
face.vertices.push_back(v100);
face.vertices.push_back(v110);
face.vertices.push_back(v111);
@@ -86,6 +88,7 @@
Face& face = createFace();
face.name = "bottom";
face.plane.set(0.0,1.0,0.0,1.0);
+ face.vertices.reserve(4);
face.vertices.push_back(v000);
face.vertices.push_back(v100);
face.vertices.push_back(v101);
@@ -96,6 +99,7 @@
Face& face = createFace();
face.name = "top";
face.plane.set(0.0,-1.0,0.0,1.0);
+ face.vertices.reserve(4);
face.vertices.push_back(v111);
face.vertices.push_back(v011);
face.vertices.push_back(v010);
@@ -107,6 +111,7 @@
Face& face = createFace();
face.name = "near";
face.plane.set(0.0,0.0,1.0,1.0);
+ face.vertices.reserve(4);
face.vertices.push_back(v000);
face.vertices.push_back(v010);
face.vertices.push_back(v110);
@@ -118,6 +123,7 @@
Face& face = createFace();
face.name = "far";
face.plane.set(0.0,0.0,-1.0,1.0);
+ face.vertices.reserve(4);
face.vertices.push_back(v001);
face.vertices.push_back(v101);
face.vertices.push_back(v111);
@@ -148,6 +154,7 @@
Face& face = createFace();
face.name = "xMin";
face.plane.set(1.0,0.0,0.0,-bb.xMin());
+ face.vertices.reserve(4);
face.vertices.push_back(v000);
face.vertices.push_back(v001);
face.vertices.push_back(v011);
@@ -158,6 +165,7 @@
Face& face = createFace();
face.name = "xMax";
face.plane.set(-1.0,0.0,0.0,bb.xMax());
+ face.vertices.reserve(4);
face.vertices.push_back(v100);
face.vertices.push_back(v110);
face.vertices.push_back(v111);
@@ -168,6 +176,7 @@
Face& face = createFace();
face.name = "yMin";
face.plane.set(0.0,1.0,0.0,-bb.yMin());
+ face.vertices.reserve(4);
face.vertices.push_back(v000);
face.vertices.push_back(v100);
face.vertices.push_back(v101);
@@ -178,6 +187,7 @@
Face& face = createFace();
face.name = "yMax";
face.plane.set(0.0,-1.0,0.0,bb.yMax());
+ face.vertices.reserve(4);
face.vertices.push_back(v111);
face.vertices.push_back(v011);
face.vertices.push_back(v010);
@@ -187,6 +197,7 @@
Face& face = createFace();
face.name = "zMin";
face.plane.set(0.0,0.0,1.0,-bb.zMin());
+ face.vertices.reserve(4);
face.vertices.push_back(v000);
face.vertices.push_back(v010);
face.vertices.push_back(v110);
@@ -197,6 +208,7 @@
Face& face = createFace();
face.name = "zMax";
face.plane.set(0.0,0.0,-1.0,bb.zMax());
+ face.vertices.reserve(4);
face.vertices.push_back(v001);
face.vertices.push_back(v101);
face.vertices.push_back(v111);
@@ -600,6 +612,9 @@
void cut(const osg::Plane& plane, const std::string& name=std::string())
{
+ typedef std::vector<double> Distances;
+ Distances distances;
+ Vertices newVertices;
// osg::notify(osg::NOTICE)<<" Cutting plane "<<plane<<std::endl;
Face newFace;
@@ -619,10 +634,9 @@
// osg::notify(osg::NOTICE)<<" Face intersecting - before
"<<face.vertices.size()<<std::endl;
Vertices& vertices = face.vertices;
- Vertices newVertices;
+ newVertices.clear();
- typedef std::vector<double> Distances;
- Distances distances;
+ distances.clear();
distances.reserve(face.vertices.size());
for(Vertices::iterator vitr = vertices.begin();
vitr != vertices.end();
@@ -710,7 +724,8 @@
}
- Vertices newVertices;
+ newVertices.clear();
+ newVertices.reserve(anglePositions.size());
for(AnglePositions::iterator aitr = anglePositions.begin();
aitr != anglePositions.end();
++aitr)
signature.asc
Description: OpenPGP digital signature
_______________________________________________ osg-submissions mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
