Added stats collection to new Texture Pool code, and improved TexturePool implementation.

The Texture Pool can be enabled by setting the env var OSG_TEXTURE_POOL_SIZE=size_in_bytes.
Note, setting a size of 1 will result in the TexturePool allocating the minimum number of
textures it can without having to reuse TextureObjects from within the same frame.
This commit is contained in:
Robert Osfield
2009-09-25 18:05:54 +00:00
parent 6bc9c626f4
commit 4d75729650
5 changed files with 307 additions and 54 deletions

View File

@@ -998,6 +998,7 @@ class OSG_EXPORT Texture : public osg::StateAttribute
TextureObject* _next;
Texture* _texture;
bool _allocated;
unsigned int _frameLastUsed;
double _timeStamp;
};
@@ -1013,6 +1014,7 @@ class OSG_EXPORT Texture : public osg::StateAttribute
void discardAllDeletedTextureObjects();
void flushDeletedTextureObjects(double currentTime, double& availableTime);
TextureObject* takeFromOrphans(Texture* texture);
TextureObject* takeOrGenerate(Texture* texture);
void moveToBack(TextureObject* to);
void addToBack(TextureObject* to);
@@ -1048,7 +1050,18 @@ class OSG_EXPORT Texture : public osg::StateAttribute
unsigned int getContextID() const { return _contextID; }
void setNumberActiveTextureObjects(unsigned int size) { _numActiveTextureObjects = size; }
unsigned int& getNumberActiveTextureObjects() { return _numActiveTextureObjects; }
unsigned int getNumberActiveTextureObjects() const { return _numActiveTextureObjects; }
void setNumberOrphanedTextureObjects(unsigned int size) { _numOrphanedTextureObjects = size; }
unsigned int& getNumberOrphanedTextureObjects() { return _numOrphanedTextureObjects; }
unsigned int getNumberOrphanedTextureObjects() const { return _numOrphanedTextureObjects; }
void setCurrTexturePoolSize(unsigned int size) { _currTexturePoolSize = size; }
unsigned int& getCurrTexturePoolSize() { return _currTexturePoolSize; }
unsigned int getCurrTexturePoolSize() const { return _currTexturePoolSize; }
void setMaxTexturePoolSize(unsigned int size);
@@ -1072,13 +1085,46 @@ class OSG_EXPORT Texture : public osg::StateAttribute
void flushDeletedTextureObjects(double currentTime, double& availableTime);
void releaseTextureObject(TextureObject* to);
void newFrame(osg::FrameStamp* fs);
void resetStats();
void reportStats();
unsigned int& getFrameNumber() { return _frameNumber; }
unsigned int& getNumberFrames() { return _numFrames; }
unsigned int& getNumberDeleted() { return _numDeleted; }
double& getDeleteTime() { return _deleteTime; }
unsigned int& getNumberGenerated() { return _numGenerated; }
double& getGenerateTime() { return _generateTime; }
unsigned int& getNumberApplied() { return _numApplied; }
double& getApplyTime() { return _applyTime; }
protected:
typedef std::map< TextureProfile, osg::ref_ptr<TextureObjectSet> > TextureSetMap;
unsigned int _contextID;
unsigned int _numActiveTextureObjects;
unsigned int _numOrphanedTextureObjects;
unsigned int _currTexturePoolSize;
unsigned int _maxTexturePoolSize;
TextureSetMap _textureSetMap;
unsigned int _frameNumber;
unsigned int _numFrames;
unsigned int _numDeleted;
double _deleteTime;
unsigned int _numGenerated;
double _generateTime;
unsigned int _numApplied;
double _applyTime;
};
static osg::ref_ptr<Texture::TextureObjectManager>& getTextureObjectManager(unsigned int contextID);

View File

@@ -74,6 +74,59 @@ class OSG_EXPORT Timer {
Timer_t _startTick;
double _secsPerTick;
};
/** Helper class for timing sections of code. */
class ElapsedTime
{
public:
inline ElapsedTime(double* elapsedTime, osg::Timer* timer = 0):
_time(elapsedTime)
{
init(timer);
}
inline ElapsedTime(osg::Timer* timer = 0):
_time(0)
{
init(timer);
}
inline ~ElapsedTime()
{
finish();
}
inline void reset()
{
_startTick = _timer->tick();
}
inline double elapsedTime() const
{
return _timer->delta_s(_startTick, _timer->tick());
}
inline void finish()
{
Timer_t endTick = _timer->tick();
if (_time) *_time += _timer->delta_s(_startTick, endTick);
_startTick = endTick;
}
protected:
inline void init(osg::Timer* timer)
{
if (timer) _timer = timer;
else _timer = osg::Timer::instance();
_startTick = _timer->tick();
}
double* _time;
Timer* _timer;
Timer_t _startTick;
};