From Maceij Krol, "I have implement frame based expiration of PagedLOD children.
New attribute DatabasePager::_expiryFrames sets number of frames a PagedLOD child is kept in memory. The attribute is set with DatabasePager::setExpiryFrames method or OSG_EXPIRY_FRAMES environmental variable. New attribute PagedLOD::PerRangeData::_ frameNumber contains frame number of last cull traversal. Children of PagedLOD are expired when time _AND_ number of frames since last cull traversal exceed OSG_EXPIRY_DELAY _AND_ OSG_EXPIRY_FRAMES respectively. By default OSG_EXPIRY_FRAMES = 1 which means that nodes from last cull/rendering traversal will not be expired even if last cull time exceeds OSG_EXPIRY_DELAY. Setting OSG_EXPIRY_FRAMES = 0 revokes previous behaviour of PagedLOD. Setting OSG_EXPIRY_FRAMES > 0 fixes problems of children reloading in lazy rendering applications. Required behaviour is achieved by manipulating OSG_EXPIRY_DELAY and OSG_EXPIRY_FRAMES together. Two interface changes are made: DatabasePager::updateSceneGraph(double currentFrameTime) is replaced by DatabasePager::updateSceneGraph(const osg::FrameStamp &frameStamp). The previous method is in #if 0 clause in the header file. Robert, decide if You want to include it. PagedLOD::removeExpiredChildren(double expiryTime, NodeList &removedChildren) is deprecated (warning is printed), when subclassing use PagedLOD::removeExpiredChildren(double expiryTime, int expiryFrame, NodeList &removedChildren) instead. "
This commit is contained in:
@@ -22,13 +22,15 @@ using namespace osg;
|
||||
PagedLOD::PerRangeData::PerRangeData():
|
||||
_priorityOffset(0.0f),
|
||||
_priorityScale(1.0f),
|
||||
_timeStamp(0.0f) {}
|
||||
_timeStamp(0.0f),
|
||||
_frameNumber(0) {}
|
||||
|
||||
PagedLOD::PerRangeData::PerRangeData(const PerRangeData& prd):
|
||||
_filename(prd._filename),
|
||||
_priorityOffset(prd._priorityOffset),
|
||||
_priorityScale(prd._priorityScale),
|
||||
_timeStamp(prd._timeStamp),
|
||||
_frameNumber(prd._frameNumber),
|
||||
_databaseRequest(prd._databaseRequest) {}
|
||||
|
||||
PagedLOD::PerRangeData& PagedLOD::PerRangeData::operator = (const PerRangeData& prd)
|
||||
@@ -38,6 +40,7 @@ PagedLOD::PerRangeData& PagedLOD::PerRangeData::operator = (const PerRangeData&
|
||||
_priorityOffset = prd._priorityOffset;
|
||||
_priorityScale = prd._priorityScale;
|
||||
_timeStamp = prd._timeStamp;
|
||||
_frameNumber = prd._frameNumber;
|
||||
_databaseRequest = prd._databaseRequest;
|
||||
return *this;
|
||||
}
|
||||
@@ -114,6 +117,7 @@ void PagedLOD::traverse(NodeVisitor& nv)
|
||||
if (nv.getFrameStamp()) setFrameNumberOfLastTraversal(nv.getFrameStamp()->getFrameNumber());
|
||||
|
||||
double timeStamp = nv.getFrameStamp()?nv.getFrameStamp()->getReferenceTime():0.0;
|
||||
int frameNumber = nv.getFrameStamp()?nv.getFrameStamp()->getFrameNumber():0;
|
||||
bool updateTimeStamp = nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR;
|
||||
|
||||
switch(nv.getTraversalMode())
|
||||
@@ -154,7 +158,11 @@ void PagedLOD::traverse(NodeVisitor& nv)
|
||||
{
|
||||
if (i<_children.size())
|
||||
{
|
||||
if (updateTimeStamp) _perRangeDataList[i]._timeStamp=timeStamp;
|
||||
if (updateTimeStamp)
|
||||
{
|
||||
_perRangeDataList[i]._timeStamp=timeStamp;
|
||||
_perRangeDataList[i]._frameNumber=frameNumber;
|
||||
}
|
||||
|
||||
_children[i]->accept(nv);
|
||||
lastChildTraversed = (int)i;
|
||||
@@ -173,7 +181,11 @@ void PagedLOD::traverse(NodeVisitor& nv)
|
||||
// select the last valid child.
|
||||
if (numChildren>0 && ((int)numChildren-1)!=lastChildTraversed)
|
||||
{
|
||||
if (updateTimeStamp) _perRangeDataList[numChildren-1]._timeStamp=timeStamp;
|
||||
if (updateTimeStamp)
|
||||
{
|
||||
_perRangeDataList[numChildren-1]._timeStamp=timeStamp;
|
||||
_perRangeDataList[numChildren-1]._frameNumber=frameNumber;
|
||||
}
|
||||
_children[numChildren-1]->accept(nv);
|
||||
}
|
||||
|
||||
@@ -261,12 +273,14 @@ bool PagedLOD::removeChildren( unsigned int pos,unsigned int numChildrenToRemove
|
||||
return Group::removeChildren(pos,numChildrenToRemove);
|
||||
}
|
||||
|
||||
bool PagedLOD::removeExpiredChildren(double expiryTime,NodeList& removedChildren)
|
||||
bool PagedLOD::removeExpiredChildren(double expiryTime, int expiryFrame, NodeList& removedChildren)
|
||||
{
|
||||
if (_children.size()>_numChildrenThatCannotBeExpired)
|
||||
{
|
||||
if (!_perRangeDataList[_children.size()-1]._filename.empty() && _perRangeDataList[_children.size()-1]._timeStamp<expiryTime)
|
||||
{
|
||||
if (!_perRangeDataList[_children.size()-1]._filename.empty() &&
|
||||
_perRangeDataList[_children.size()-1]._timeStamp<expiryTime &&
|
||||
_perRangeDataList[_children.size()-1]._frameNumber<expiryFrame)
|
||||
{
|
||||
osg::Node* nodeToRemove = _children[_children.size()-1].get();
|
||||
removedChildren.push_back(nodeToRemove);
|
||||
return Group::removeChildren(_children.size()-1,1);
|
||||
|
||||
Reference in New Issue
Block a user