Fixed the size computation
This commit is contained in:
@@ -1189,7 +1189,8 @@ class OSG_EXPORT Texture : public osg::StateAttribute
|
|||||||
void newFrame(osg::FrameStamp* fs);
|
void newFrame(osg::FrameStamp* fs);
|
||||||
void resetStats();
|
void resetStats();
|
||||||
void reportStats(std::ostream& out);
|
void reportStats(std::ostream& out);
|
||||||
void recomputeStats(std::ostream& out);
|
void recomputeStats(std::ostream& out) const;
|
||||||
|
bool checkConsistency() const;
|
||||||
|
|
||||||
unsigned int& getFrameNumber() { return _frameNumber; }
|
unsigned int& getFrameNumber() { return _frameNumber; }
|
||||||
unsigned int& getNumberFrames() { return _numFrames; }
|
unsigned int& getNumberFrames() { return _numFrames; }
|
||||||
|
|||||||
@@ -1159,7 +1159,7 @@ void GLBufferObjectManager::recomputeStats(std::ostream& out)
|
|||||||
numActive += os->getNumOfGLBufferObjects();
|
numActive += os->getNumOfGLBufferObjects();
|
||||||
numOrphans += os->getNumOrphans();
|
numOrphans += os->getNumOrphans();
|
||||||
numPendingOrphans += os->getNumPendingOrphans();
|
numPendingOrphans += os->getNumPendingOrphans();
|
||||||
currentSize += os->getProfile()._size * (numObjectsInLists+numOrphans);
|
currentSize += os->getProfile()._size * (os->computeNumGLBufferObjectsInList()+os->getNumOrphans());
|
||||||
out<<" size="<<os->getProfile()._size
|
out<<" size="<<os->getProfile()._size
|
||||||
<<", os->computeNumGLBufferObjectsInList()"<<os->computeNumGLBufferObjectsInList()
|
<<", os->computeNumGLBufferObjectsInList()"<<os->computeNumGLBufferObjectsInList()
|
||||||
<<", os->getNumOfGLBufferObjects()"<<os->getNumOfGLBufferObjects()
|
<<", os->getNumOfGLBufferObjects()"<<os->getNumOfGLBufferObjects()
|
||||||
|
|||||||
@@ -267,6 +267,7 @@ void Texture::TextureObjectSet::deleteAllTextureObjects()
|
|||||||
// OSG_NOTICE<<"Texture::TextureObjectSet::deleteAllTextureObjects()"<<std::endl;
|
// OSG_NOTICE<<"Texture::TextureObjectSet::deleteAllTextureObjects()"<<std::endl;
|
||||||
|
|
||||||
// detect all the active texture objects from their Textures
|
// detect all the active texture objects from their Textures
|
||||||
|
unsigned int numOrphaned = 0;
|
||||||
TextureObject* to = _head;
|
TextureObject* to = _head;
|
||||||
while(to!=0)
|
while(to!=0)
|
||||||
{
|
{
|
||||||
@@ -275,8 +276,11 @@ void Texture::TextureObjectSet::deleteAllTextureObjects()
|
|||||||
to = to->_next;
|
to = to->_next;
|
||||||
|
|
||||||
_orphanedTextureObjects.push_back(glto.get());
|
_orphanedTextureObjects.push_back(glto.get());
|
||||||
|
|
||||||
remove(glto.get());
|
remove(glto.get());
|
||||||
|
|
||||||
|
++numOrphaned;
|
||||||
|
|
||||||
ref_ptr<Texture> original_texture = glto->getTexture();
|
ref_ptr<Texture> original_texture = glto->getTexture();
|
||||||
if (original_texture.valid())
|
if (original_texture.valid())
|
||||||
{
|
{
|
||||||
@@ -284,6 +288,9 @@ void Texture::TextureObjectSet::deleteAllTextureObjects()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_parent->getNumberOrphanedTextureObjects() += numOrphaned;
|
||||||
|
_parent->getNumberActiveTextureObjects() -= numOrphaned;
|
||||||
|
|
||||||
// now do the actual delete.
|
// now do the actual delete.
|
||||||
flushAllDeletedTextureObjects();
|
flushAllDeletedTextureObjects();
|
||||||
|
|
||||||
@@ -378,7 +385,7 @@ void Texture::TextureObjectSet::discardAllDeletedTextureObjects()
|
|||||||
_numOfTextureObjects -= numDiscarded;
|
_numOfTextureObjects -= numDiscarded;
|
||||||
|
|
||||||
// update the TextureObjectManager's running total of current pool size
|
// update the TextureObjectManager's running total of current pool size
|
||||||
_parent->setCurrTexturePoolSize( _parent->getCurrTexturePoolSize() - numDiscarded*_profile._size );
|
_parent->getCurrTexturePoolSize() -= numDiscarded*_profile._size;
|
||||||
|
|
||||||
// update the number of active and orphaned TextureOjects
|
// update the number of active and orphaned TextureOjects
|
||||||
_parent->getNumberOrphanedTextureObjects() -= numDiscarded;
|
_parent->getNumberOrphanedTextureObjects() -= numDiscarded;
|
||||||
@@ -445,7 +452,7 @@ void Texture::TextureObjectSet::flushDeletedTextureObjects(double currentTime, d
|
|||||||
// update the number of TO's in this TextureObjectSet
|
// update the number of TO's in this TextureObjectSet
|
||||||
_numOfTextureObjects -= numDeleted;
|
_numOfTextureObjects -= numDeleted;
|
||||||
|
|
||||||
_parent->setCurrTexturePoolSize( _parent->getCurrTexturePoolSize() - numDeleted*_profile._size );
|
_parent->getCurrTexturePoolSize() -= numDeleted*_profile._size;
|
||||||
|
|
||||||
// update the number of active and orphaned TextureOjects
|
// update the number of active and orphaned TextureOjects
|
||||||
_parent->getNumberOrphanedTextureObjects() -= numDeleted;
|
_parent->getNumberOrphanedTextureObjects() -= numDeleted;
|
||||||
@@ -879,16 +886,6 @@ void Texture::TextureObjectManager::flushDeletedTextureObjects(double currentTim
|
|||||||
{
|
{
|
||||||
ElapsedTime elapsedTime(&(getDeleteTime()));
|
ElapsedTime elapsedTime(&(getDeleteTime()));
|
||||||
|
|
||||||
#if 0
|
|
||||||
static double max_ratio = 0.0f;
|
|
||||||
double ratio = double(getCurrTexturePoolSize())/double(getMaxTexturePoolSize());
|
|
||||||
if (ratio>max_ratio)
|
|
||||||
{
|
|
||||||
max_ratio = ratio;
|
|
||||||
}
|
|
||||||
// OSG_NOTICE<<"TexturePool Size ratio "<<ratio<<", max ratio "<<max_ratio<<std::endl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for(TextureSetMap::iterator itr = _textureSetMap.begin();
|
for(TextureSetMap::iterator itr = _textureSetMap.begin();
|
||||||
(itr != _textureSetMap.end()) && (availableTime > 0.0);
|
(itr != _textureSetMap.end()) && (availableTime > 0.0);
|
||||||
++itr)
|
++itr)
|
||||||
@@ -938,7 +935,7 @@ void Texture::TextureObjectManager::resetStats()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Texture::TextureObjectManager::recomputeStats(std::ostream& out)
|
void Texture::TextureObjectManager::recomputeStats(std::ostream& out) const
|
||||||
{
|
{
|
||||||
out<<"Texture::TextureObjectManager::recomputeStats()"<<std::endl;
|
out<<"Texture::TextureObjectManager::recomputeStats()"<<std::endl;
|
||||||
unsigned int numObjectsInLists = 0;
|
unsigned int numObjectsInLists = 0;
|
||||||
@@ -946,25 +943,55 @@ void Texture::TextureObjectManager::recomputeStats(std::ostream& out)
|
|||||||
unsigned int numOrphans = 0;
|
unsigned int numOrphans = 0;
|
||||||
unsigned int numPendingOrphans = 0;
|
unsigned int numPendingOrphans = 0;
|
||||||
unsigned int currentSize = 0;
|
unsigned int currentSize = 0;
|
||||||
for(TextureSetMap::iterator itr = _textureSetMap.begin();
|
for(TextureSetMap::const_iterator itr = _textureSetMap.begin();
|
||||||
itr != _textureSetMap.end();
|
itr != _textureSetMap.end();
|
||||||
++itr)
|
++itr)
|
||||||
{
|
{
|
||||||
TextureObjectSet* os = itr->second.get();
|
const TextureObjectSet* os = itr->second.get();
|
||||||
numObjectsInLists += os->computeNumTextureObjectsInList();
|
numObjectsInLists += os->computeNumTextureObjectsInList();
|
||||||
numActive += os->getNumOfTextureObjects();
|
numActive += os->getNumOfTextureObjects();
|
||||||
numOrphans += os->getNumOrphans();
|
numOrphans += os->getNumOrphans();
|
||||||
numPendingOrphans += os->getNumPendingOrphans();
|
numPendingOrphans += os->getNumPendingOrphans();
|
||||||
currentSize += os->getProfile()._size * (numObjectsInLists+numOrphans);
|
currentSize += os->getProfile()._size * (os->computeNumTextureObjectsInList()+os->getNumOrphans());
|
||||||
out<<" size="<<os->getProfile()._size
|
out<<" size="<<os->getProfile()._size
|
||||||
<<", os->computeNumGLBufferObjectsInList()"<<os->computeNumTextureObjectsInList()
|
<<", os->computeNumTextureObjectsInList()"<<os->computeNumTextureObjectsInList()
|
||||||
<<", os->getNumOfGLBufferObjects()"<<os->getNumOfTextureObjects()
|
<<", os->getNumOfTextureObjects()"<<os->getNumOfTextureObjects()
|
||||||
<<", os->getNumOrphans()"<<os->getNumOrphans()
|
<<", os->getNumOrphans()"<<os->getNumOrphans()
|
||||||
<<", os->getNumPendingOrphans()"<<os->getNumPendingOrphans()
|
<<", os->getNumPendingOrphans()"<<os->getNumPendingOrphans()
|
||||||
<<std::endl;
|
<<std::endl;
|
||||||
}
|
}
|
||||||
out<<" numObjectsInLists="<<numObjectsInLists<<", numActive="<<numActive<<", numOrphans="<<numOrphans<<" currentSize="<<currentSize<<std::endl;
|
out<<" numObjectsInLists="<<numObjectsInLists<<", numActive="<<numActive<<", numOrphans="<<numOrphans<<" currentSize="<<currentSize<<std::endl;
|
||||||
out<<" getMaxTexturePoolSize()="<<getMaxTexturePoolSize()<<" current/max size = "<<double(currentSize)/double(getMaxTexturePoolSize())<<std::endl;
|
out<<" getMaxTexturePoolSize()="<<getMaxTexturePoolSize()<<" current/max size = "<<double(currentSize)/double(getMaxTexturePoolSize())<<std::endl;
|
||||||
|
if (currentSize != _currTexturePoolSize) out<<" WARNING: _currTexturePoolSize("<<_currTexturePoolSize<<") != currentSize, delta = "<<int(_currTexturePoolSize)-int(currentSize)<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Texture::TextureObjectManager::checkConsistency() const
|
||||||
|
{
|
||||||
|
unsigned int numObjectsInLists = 0;
|
||||||
|
unsigned int numActive = 0;
|
||||||
|
unsigned int numOrphans = 0;
|
||||||
|
unsigned int numPendingOrphans = 0;
|
||||||
|
unsigned int currentSize = 0;
|
||||||
|
for(TextureSetMap::const_iterator itr = _textureSetMap.begin();
|
||||||
|
itr != _textureSetMap.end();
|
||||||
|
++itr)
|
||||||
|
{
|
||||||
|
const TextureObjectSet* os = itr->second.get();
|
||||||
|
numObjectsInLists += os->computeNumTextureObjectsInList();
|
||||||
|
numActive += os->getNumOfTextureObjects();
|
||||||
|
numOrphans += os->getNumOrphans();
|
||||||
|
numPendingOrphans += os->getNumPendingOrphans();
|
||||||
|
currentSize += os->getProfile()._size * (os->computeNumTextureObjectsInList()+os->getNumOrphans());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentSize != _currTexturePoolSize)
|
||||||
|
{
|
||||||
|
recomputeStats(osg::notify(osg::NOTICE));
|
||||||
|
|
||||||
|
throw "Texture::TextureObjectManager::checkConsistency() sizes inconsistent";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user