From 1cd6541bfd9e4112b8a9d7de4f33251d1614073d Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 17 Dec 2008 22:52:36 +0000 Subject: [PATCH] Improved the effectiveness of the new max target number PageLOD's --- src/osg/PagedLOD.cpp | 6 ++++- src/osgDB/DatabasePager.cpp | 43 +++++++++++++++++++++++------- src/osgParticle/ParticleSystem.cpp | 2 +- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/osg/PagedLOD.cpp b/src/osg/PagedLOD.cpp index 0b74544de..fb5771ef9 100644 --- a/src/osg/PagedLOD.cpp +++ b/src/osg/PagedLOD.cpp @@ -117,7 +117,11 @@ void PagedLOD::traverse(NodeVisitor& nv) { // set the frame number of the traversal so that external nodes can find out how active this // node is. - if (nv.getFrameStamp()) setFrameNumberOfLastTraversal(nv.getFrameStamp()->getFrameNumber()); + if (nv.getFrameStamp() && + nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) + { + setFrameNumberOfLastTraversal(nv.getFrameStamp()->getFrameNumber()); + } double timeStamp = nv.getFrameStamp()?nv.getFrameStamp()->getReferenceTime():0.0; int frameNumber = nv.getFrameStamp()?nv.getFrameStamp()->getFrameNumber():0; diff --git a/src/osgDB/DatabasePager.cpp b/src/osgDB/DatabasePager.cpp index 2b29b6a9a..a54cf7ec1 100644 --- a/src/osgDB/DatabasePager.cpp +++ b/src/osgDB/DatabasePager.cpp @@ -1584,7 +1584,6 @@ void DatabasePager::capped_removeExpiredSubgraphs(const osg::FrameStamp& frameSt int inactivePLOD = _inactivePagedLODList.size(); - PagedLODList& pagedLODList = _inactivePagedLODList; osg::Timer_t end_a_Tick = osg::Timer::instance()->tick(); double time_a = osg::Timer::instance()->delta_m(startTick,end_a_Tick); @@ -1606,6 +1605,7 @@ void DatabasePager::capped_removeExpiredSubgraphs(const osg::FrameStamp& frameSt numToPrune = inactivePLOD; } + osg::NodeList childrenRemoved; double expiryTime = frameStamp.getReferenceTime() - 0.1; @@ -1613,9 +1613,29 @@ void DatabasePager::capped_removeExpiredSubgraphs(const osg::FrameStamp& frameSt MarkPagedLODsVisitor markerVistor("NeedToRemove"); + for(PagedLODList::iterator itr = _inactivePagedLODList.begin(); + itr!=_inactivePagedLODList.end() && markerVistor._numPagedLODsMarkedget(); - for(PagedLODList::iterator itr = pagedLODList.begin(); - itr!=pagedLODList.end() && markerVistor._numPagedLODsMarkedremoveExpiredChildren(expiryTime, expiryFrame, localChildrenRemoved); + if (!localChildrenRemoved.empty()) + { + for(osg::NodeList::iterator critr = localChildrenRemoved.begin(); + critr!=localChildrenRemoved.end(); + ++critr) + { + (*critr)->accept(markerVistor); + } + + std::copy(localChildrenRemoved.begin(),localChildrenRemoved.end(),std::back_inserter(childrenRemoved)); + } + } + + for(PagedLODList::iterator itr = _activePagedLODList.begin(); + itr!=_activePagedLODList.end() && markerVistor._numPagedLODsMarkedget(); @@ -1644,6 +1664,8 @@ void DatabasePager::capped_removeExpiredSubgraphs(const osg::FrameStamp& frameSt + //osg::notify(osg::NOTICE)<<"numToPrune "<delta_m(before,osg::Timer::instance()->tick())<<" ms "<get(); @@ -1682,19 +1704,19 @@ void DatabasePager::capped_removeExpiredSubgraphs(const osg::FrameStamp& frameSt ++numSkipped; - //osg::notify(osg::NOTICE)<<"skipping"<