From Brad Christiansen, "The attached files add the ability to control when a paged child becomes eligible for expiry based on time and/or elapsed frames.

I found that some of the items that had been paged in were being expired on the first frame that they were not visible (as the cache was full). This resulted in excessive paging every time the view was moved. With the following changes I could only allow children to be expired if they had not been used for e.g. 30 seconds or 60 frames."
This commit is contained in:
Robert Osfield
2012-02-06 12:06:40 +00:00
parent 3b4333ec9a
commit db49c23944
2 changed files with 20 additions and 2 deletions

View File

@@ -70,6 +70,8 @@ class OSG_EXPORT PagedLOD : public LOD
std::string _filename;
float _priorityOffset;
float _priorityScale;
double _minExpiryTime;
unsigned int _minExpiryFrames;
double _timeStamp;
unsigned int _frameNumber;
unsigned int _frameNumberOfLastReleaseGLObjects;
@@ -91,6 +93,16 @@ class OSG_EXPORT PagedLOD : public LOD
float getPriorityScale(unsigned int childNo) const { return _perRangeDataList[childNo]._priorityScale; }
unsigned int getNumPriorityScales() const { return _perRangeDataList.size(); }
/** Sets the minimum amount of time, in seconds, that must pass without a child being traversed before it can be expired. */
void setMinimumExpiryTime(unsigned int childNo, double minTime) { expandPerRangeDataTo(childNo); _perRangeDataList[childNo]._minExpiryTime=minTime; }
double getMinimumExpiryTime(unsigned int childNo) const { return _perRangeDataList[childNo]._minExpiryTime; }
unsigned int getNumMinimumExpiryTimes() const { return _perRangeDataList.size(); }
/** Sets the minimum number of frames that must be rendered without a child being traversed before it can be expired. */
void setMinimumExpiryFrames(unsigned int childNo, unsigned int minFrames) { expandPerRangeDataTo(childNo); _perRangeDataList[childNo]._minExpiryFrames=minFrames; }
unsigned int getMinimumExpiryFrames(unsigned int childNo) const { return _perRangeDataList[childNo]._minExpiryFrames; }
unsigned int getNumMinimumExpiryFrames() const { return _perRangeDataList.size(); }
void setTimeStamp(unsigned int childNo, double timeStamp) { expandPerRangeDataTo(childNo); _perRangeDataList[childNo]._timeStamp=timeStamp; }
double getTimeStamp(unsigned int childNo) const { return _perRangeDataList[childNo]._timeStamp; }

View File

@@ -22,6 +22,8 @@ using namespace osg;
PagedLOD::PerRangeData::PerRangeData():
_priorityOffset(0.0f),
_priorityScale(1.0f),
_minExpiryTime(0.0),
_minExpiryFrames(0),
_timeStamp(0.0f),
_frameNumber(0),
_frameNumberOfLastReleaseGLObjects(0) {}
@@ -30,6 +32,8 @@ PagedLOD::PerRangeData::PerRangeData(const PerRangeData& prd):
_filename(prd._filename),
_priorityOffset(prd._priorityOffset),
_priorityScale(prd._priorityScale),
_minExpiryTime(prd._minExpiryTime),
_minExpiryFrames(prd._minExpiryFrames),
_timeStamp(prd._timeStamp),
_frameNumber(prd._frameNumber),
_frameNumberOfLastReleaseGLObjects(prd._frameNumberOfLastReleaseGLObjects),
@@ -45,6 +49,8 @@ PagedLOD::PerRangeData& PagedLOD::PerRangeData::operator = (const PerRangeData&
_frameNumber = prd._frameNumber;
_frameNumberOfLastReleaseGLObjects = prd._frameNumberOfLastReleaseGLObjects;
_databaseRequest = prd._databaseRequest;
_minExpiryTime = prd._minExpiryTime;
_minExpiryFrames = prd._minExpiryFrames;
return *this;
}
@@ -290,8 +296,8 @@ bool PagedLOD::removeExpiredChildren(double expiryTime, unsigned int expiryFrame
{
unsigned cindex = _children.size() - 1;
if (!_perRangeDataList[cindex]._filename.empty() &&
_perRangeDataList[cindex]._timeStamp<expiryTime &&
_perRangeDataList[cindex]._frameNumber<expiryFrame)
_perRangeDataList[cindex]._timeStamp + _perRangeDataList[cindex]._minExpiryTime < expiryTime &&
_perRangeDataList[cindex]._frameNumber + _perRangeDataList[cindex]._minExpiryFrames < expiryFrame)
{
osg::Node* nodeToRemove = _children[cindex].get();
removedChildren.push_back(nodeToRemove);