Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

# OgreProfiler.h

Go to the documentation of this file.

    00001 /*
    00002 -----------------------------------------------------------------------------
    00003 This source file is part of OGRE
    00004     (Object-oriented Graphics Rendering Engine)
    00005 For the latest info, see http://www.ogre3d.org/
    00006
    00007 Copyright (c) 2000-2006 Torus Knot Software Ltd
    00008 Also see acknowledgements in Readme.html
    00009
    00010 This program is free software; you can redistribute it and/or modify it under
    00011 the terms of the GNU Lesser General Public License as published by the Free Software
    00012 Foundation; either version 2 of the License, or (at your option) any later
    00013 version.
    00014
    00015 This program is distributed in the hope that it will be useful, but WITHOUT
    00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
    00018
    00019 You should have received a copy of the GNU Lesser General Public License along with
    00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
    00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
    00022 http://www.gnu.org/copyleft/lesser.txt.
    00023
    00024 You may alternatively use this source under the terms of a specific version of
    00025 the OGRE Unrestricted License provided you have obtained such a license from
    00026 Torus Knot Software Ltd.
    00027 -----------------------------------------------------------------------------
    00028 */
    00029 /*
    00030
    00031     Although the code is original, many of the ideas for the profiler were borrowed from
    00032 "Real-Time In-Game Profiling" by Steve Rabin which can be found in Game Programming
    00033 Gems 1.
    00034
    00035     This code can easily be adapted to your own non-Ogre project. The only code that is
    00036 Ogre-dependent is in the visualization/logging routines and the use of the Timer class.
    00037
    00038     Enjoy!
    00039
    00040 */
    00041
    00042 #ifndef __Profiler_H__
    00043 #define __Profiler_H__
    00044
    00045 #include "OgrePrerequisites.h"
    00046 #include "OgreSingleton.h"
    00047 #include "OgreString.h"
    00048 #include "OgreOverlay.h"
    00049
    00050 #if OGRE_PROFILING == 1
    00051 #   if OGRE_COMPILER != OGRE_COMPILER_BORL
    00052 #       define OgreProfile( a ) Ogre::Profile _OgreProfileInstance( (a) )
    00053 #       define OgreProfileBegin( a ) Ogre::Profiler::getSingleton().beginProfile( (a) )
    00054 #       define OgreProfileEnd( a ) Ogre::Profiler::getSingleton().endProfile( (a) )
    00055 #   else
    00056 #       define OgreProfile( a ) Ogre::Profile _OgreProfileInstance( __FUNC__ )
    00057 #       define OgreProfileBegin( a ) Ogre::Profiler::getSingleton().beginProfile( __FUNC__ )
    00058 #       define OgreProfileEnd( a ) Ogre::Profiler::getSingleton().endProfile( __FUNC__ )
    00059 #   endif
    00060 #else
    00061 #   define OgreProfile( a )
    00062 #   define OgreProfileBegin( a )
    00063 #   define OgreProfileEnd( a )
    00064 #endif
    00065
    00066 namespace Ogre {
    00067
    00078     class _OgreExport Profile {
    00079
    00080         public:
    00081             Profile(const String& profileName);
    00082             ~Profile();
    00083
    00084         protected:
    00085
    00087             String mName;
    00088
    00089
    00090     };
    00091
    00103     class _OgreExport Profiler : public Singleton<Profiler> {
    00104
    00105         public:
    00106             Profiler();
    00107             ~Profiler();
    00108
    00110             void setTimer(Timer* t);
    00111
    00113             Timer* getTimer();
    00114
    00127             void beginProfile(const String& profileName);
    00128
    00141             void endProfile(const String& profileName);
    00142
    00148             void setEnabled(bool enabled);
    00149
    00151             bool getEnabled() const;
    00152
    00157             void enableProfile(const String& profileName);
    00158
    00163             void disableProfile(const String& profileName);
    00164
    00170             bool watchForMax(const String& profileName);
    00171
    00177             bool watchForMin(const String& profileName);
    00178
    00188             bool watchForLimit(const String& profileName, Real limit, bool greaterThan = true);
    00189
    00191             void logResults();
    00192
    00194             void reset();
    00195
    00197             void setUpdateDisplayFrequency(uint freq);
    00198
    00200             uint getUpdateDisplayFrequency() const;
    00201
    00217             static Profiler& getSingleton(void);
    00233             static Profiler* getSingletonPtr(void);
    00234
    00235         protected:
    00236
    00238             void initialize();
    00239
    00241             void displayResults();
    00242
    00244             void processFrameStats();
    00245
    00247             void changeEnableState();
    00248
    00250             OverlayContainer* createContainer();
    00251
    00253             OverlayElement* createTextArea(const String& name, Real width, Real height, Real top, Real left,
    00254                                        uint fontSize, const String& caption, bool show = true);
    00255
    00257             OverlayElement* createPanel(const String& name, Real width, Real height, Real top, Real left,
    00258                                     const String& materialName, bool show = true);
    00259
    00261             struct ProfileInstance {
    00262
    00264                 String      name;
    00265
    00267                 String      parent;
    00268
    00270                 ulong       currTime;
    00271
    00274                 ulong       accum;
    00275
    00277                 uint        hierarchicalLvl;
    00278             };
    00279
    00282             struct ProfileFrame {
    00283
    00285                 String  name;
    00286
    00288                 ulong   frameTime;
    00289
    00291                 uint    calls;
    00292
    00294                 uint    hierarchicalLvl;
    00295
    00296             };
    00297
    00299             struct ProfileHistory {
    00300
    00302                 String  name;
    00303
    00305                 Real    currentTime; // %
    00306
    00308                 Real    maxTime; // %
    00309
    00311                 Real    minTime; // %
    00312
    00314                 uint    numCallsThisFrame;
    00315
    00318                 Real    totalTime; // %
    00319
    00322                 ulong   totalCalls; // %
    00323
    00325                 uint    hierarchicalLvl;
    00326
    00327             };
    00328
    00329
    00330             typedef std::list<ProfileInstance> ProfileStack;
    00331             typedef std::list<ProfileFrame> ProfileFrameList;
    00332             typedef std::list<ProfileHistory> ProfileHistoryList;
    00333             typedef std::map<String, ProfileHistoryList::iterator> ProfileHistoryMap;
    00334             typedef std::map<String, bool> DisabledProfileMap;
    00335
    00336             typedef std::list<OverlayElement*> ProfileBarList;
    00337
    00339             ProfileStack mProfiles;
    00340
    00343             ProfileFrameList mProfileFrame;
    00344
    00346             ProfileHistoryList mProfileHistory;
    00347
    00349             ProfileHistoryMap mProfileHistoryMap;
    00350
    00352             DisabledProfileMap mDisabledProfiles;
    00353
    00355             ProfileBarList mProfileBars;
    00356
    00358             bool mInitialized;
    00359
    00361             uint maxProfiles;
    00362
    00364             Overlay* mOverlay;
    00365
    00367             OverlayContainer* mProfileGui;
    00368
    00370             Real mBarHeight;
    00371
    00373             Real mGuiHeight;
    00374
    00376             Real mGuiWidth;
    00377
    00379             Real mBarIndent;
    00380
    00382             Real mGuiBorderWidth;
    00383
    00385             Real mBarLineWidth;
    00386
    00389             uint mUpdateDisplayFrequency;
    00390
    00392             uint mCurrentFrame;
    00393
    00395             Timer* mTimer;
    00396
    00398             ulong mTotalFrameTime;
    00399
    00401             bool mEnabled;
    00402
    00405             bool mEnableStateChangePending;
    00406
    00409             bool mNewEnableState;
    00410
    00411     }; // end class
    00412
    00413 } // end namespace
    00414
    00415 #endif

Copyright © 2000-2005 by The OGRE Team
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.
Last modified Sun Sep 30 10:50:57 2007