Skip to content

Commit

Permalink
GRAPHICS: Add FPS / frame time calculation
Browse files Browse the repository at this point in the history
  • Loading branch information
DrMcCoy committed Mar 20, 2014
1 parent f0b77ff commit 70a86fa
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 0 deletions.
21 changes: 21 additions & 0 deletions src/graphics/graphics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,27 @@ bool GraphicsManager::setGamma(float gamma) {
return true;
}

double GraphicsManager::getAverageFrameTime() const {
if (!_renderer)
return 0.0;

return _renderer->getAverageFrameTime();
}

double GraphicsManager::getAverageFPS() const {
if (!_renderer)
return 0.0;

return _renderer->getAverageFPS();
}

bool GraphicsManager::getRenderStatistics(double &averageFrameTime, double &averageFPS) const {
if (!_renderer)
return false;

return _renderer->getRenderStatistics(averageFrameTime, averageFPS);
}

void GraphicsManager::renderScene() {
Common::enforceMainThread();

Expand Down
5 changes: 5 additions & 0 deletions src/graphics/graphics.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,11 @@ class GraphicsManager : public Common::Singleton<GraphicsManager> {
/** Set the overall gamma correction. */
bool setGamma(float gamma);

double getAverageFrameTime() const;
double getAverageFPS() const;

bool getRenderStatistics(double &averageFrameTime, double &averageFPS) const;

/** Render one complete frame of the scene. */
void renderScene();

Expand Down
57 changes: 57 additions & 0 deletions src/graphics/renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,11 @@ class OgreLogger : public Ogre::LogListener {
};

class OgreAnimator : public Ogre::FrameListener {
private:
static const uint kFrameTimeAverageCount = 5;

std::list<double> _frameTimes;

public:
bool frameStarted(const Ogre::FrameEvent &event) {
Ogre::SceneManager *scene = Ogre::Root::getSingleton().getSceneManagerIterator().begin()->second;
Expand All @@ -77,11 +82,37 @@ class OgreAnimator : public Ogre::FrameListener {

OGRE_LOCK_MUTEX(scene->sceneGraphMutex);

_frameTimes.push_back(event.timeSinceLastFrame);
if (_frameTimes.size() > kFrameTimeAverageCount)
_frameTimes.pop_front();

for (Ogre::AnimationStateIterator anims = scene->getAnimationStateIterator(); anims.hasMoreElements(); anims.moveNext())
anims.current()->second->addTime(event.timeSinceLastFrame);

return true;
}

double getAverageFrameTime() const {
Ogre::SceneManager *scene = Ogre::Root::getSingleton().getSceneManagerIterator().begin()->second;
if (!scene)
return 0.0;

OGRE_LOCK_MUTEX(scene->sceneGraphMutex);

double average = 0.0;
for (std::list<double>::const_iterator f = _frameTimes.begin(); f != _frameTimes.end(); ++f)
average += *f;

return average / _frameTimes.size();
}

double getAverageFPS() const {
double averageFrameTime = getAverageFrameTime();
if (averageFrameTime <= 0.0)
return 0.0;

return 1.0 / averageFrameTime;
}
};

Renderer::Renderer(SDL_Window &screen, bool vsync, int fsaa) :
Expand Down Expand Up @@ -334,6 +365,32 @@ void Renderer::render() {
_root->renderOneFrame();
}

double Renderer::getAverageFrameTime() const {
if (!_animator)
return 0.0;

return _animator->getAverageFrameTime();
}

double Renderer::getAverageFPS() const {
if (!_animator)
return 0.0;

return _animator->getAverageFPS();
}

bool Renderer::getRenderStatistics(double &averageFrameTime, double &averageFPS) const {
if (!_sceneManager)
return false;

OGRE_LOCK_MUTEX(_sceneManager->sceneGraphMutex);

averageFrameTime = getAverageFrameTime();
averageFPS = getAverageFPS();

return true;
}

bool Renderer::hasCapability(RenderCapability c) const {
switch (c) {
case kCapabilityS3TC:
Expand Down
6 changes: 6 additions & 0 deletions src/graphics/renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,12 @@ class Renderer {
/** Render one frame. */
void render();

double getAverageFrameTime() const;
double getAverageFPS() const;

bool getRenderStatistics(double &averageFrameTime, double &averageFPS) const;


private:
Common::UString _pluginDirectory; ///< Directory where the OGRE plugins can be found.

Expand Down

0 comments on commit 70a86fa

Please sign in to comment.