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 © 2000-2002 The OGRE Team 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 */ 00025 /* 00026 00027 Although the code is original, many of the ideas for the profiler were borrowed from 00028 "Real-Time In-Game Profiling" by Steve Rabin which can be found in Game Programming 00029 Gems 1. 00030 00031 This code can easily be adapted to your own non-Ogre project. The only code that is 00032 Ogre-dependent is in the visualization/logging routines and the use of the Timer class. 00033 00034 Enjoy! 00035 00036 */ 00037 00038 #ifndef __Profiler_H__ 00039 #define __Profiler_H__ 00040 00041 #include "OgrePrerequisites.h" 00042 #include "OgreSingleton.h" 00043 #include "OgreString.h" 00044 00045 #if OGRE_PROFILING == 1 00046 # if OGRE_COMPILER != COMPILER_BORL 00047 # define OgreProfile( a ) Ogre::Profile _OgreProfileInstance( (a) ) 00048 # define OgreProfileBegin( a ) Ogre::Profiler::getSingleton().beginProfile( (a) ) 00049 # define OgreProfileEnd( a ) Ogre::Profiler::getSingleton().endProfile( (a) ) 00050 # else 00051 # define OgreProfile( a ) Ogre::Profile _OgreProfileInstance( __FUNC__ ) 00052 # define OgreProfileBegin( a ) Ogre::Profiler::getSingleton().beginProfile( __FUNC__ ) 00053 # define OgreProfileEnd( a ) Ogre::Profiler::getSingleton().endProfile( __FUNC__ ) 00054 # endif 00055 #else 00056 # define OgreProfile( a ) 00057 # define OgreProfileBegin( a ) 00058 # define OgreProfileEnd( a ) 00059 #endif 00060 00061 namespace Ogre { 00062 00073 class _OgreExport Profile { 00074 00075 public: 00076 Profile(const String& profileName); 00077 ~Profile(); 00078 00079 protected: 00080 00082 String mName; 00083 00084 00085 }; 00086 00098 class _OgreExport Profiler : public Singleton<Profiler> { 00099 00100 public: 00101 Profiler(); 00102 ~Profiler(); 00103 00105 void setTimer(Timer* t); 00106 00108 Timer* getTimer(); 00109 00122 void beginProfile(const String& profileName); 00123 00136 void endProfile(const String& profileName); 00137 00143 void setEnabled(bool enabled); 00144 00146 bool getEnabled() const; 00147 00152 void enableProfile(const String& profileName); 00153 00158 void disableProfile(const String& profileName); 00159 00165 bool watchForMax(const String& profileName); 00166 00172 bool watchForMin(const String& profileName); 00173 00183 bool watchForLimit(const String& profileName, Real limit, bool greaterThan = true); 00184 00186 void logResults(); 00187 00189 void reset(); 00190 00192 void setUpdateDisplayFrequency(uint freq); 00193 00195 uint getUpdateDisplayFrequency() const; 00196 00212 static Profiler& getSingleton(void); 00228 static Profiler* getSingletonPtr(void); 00229 00230 protected: 00231 00233 void initialize(); 00234 00236 void displayResults(); 00237 00239 void processFrameStats(); 00240 00242 void changeEnableState(); 00243 00245 GuiContainer* createContainer(); 00246 00248 GuiElement* createTextArea(const String& name, Real width, Real height, Real top, Real left, 00249 uint fontSize, const String& caption, bool show = true); 00250 00252 GuiElement* createPanel(const String& name, Real width, Real height, Real top, Real left, 00253 const String& materialName, bool show = true); 00254 00256 struct ProfileInstance { 00257 00259 String name; 00260 00262 String parent; 00263 00265 ulong currTime; 00266 00269 ulong accum; 00270 00272 uint hierarchicalLvl; 00273 }; 00274 00277 struct ProfileFrame { 00278 00280 String name; 00281 00283 ulong frameTime; 00284 00286 uint calls; 00287 00289 uint hierarchicalLvl; 00290 00291 }; 00292 00294 struct ProfileHistory { 00295 00297 String name; 00298 00300 Real currentTime; // % 00301 00303 Real maxTime; // % 00304 00306 Real minTime; // % 00307 00309 uint numCallsThisFrame; 00310 00313 Real totalTime; // % 00314 00317 ulong totalCalls; // % 00318 00320 uint hierarchicalLvl; 00321 00322 }; 00323 00324 00325 typedef std::list<ProfileInstance> ProfileStack; 00326 typedef std::list<ProfileFrame> ProfileFrameList; 00327 typedef std::list<ProfileHistory> ProfileHistoryList; 00328 typedef std::map<String, ProfileHistoryList::iterator> ProfileHistoryMap; 00329 typedef std::map<String, bool> DisabledProfileMap; 00330 00331 typedef std::list<GuiElement*> ProfileBarList; 00332 00334 ProfileStack mProfiles; 00335 00338 ProfileFrameList mProfileFrame; 00339 00341 ProfileHistoryList mProfileHistory; 00342 00344 ProfileHistoryMap mProfileHistoryMap; 00345 00347 DisabledProfileMap mDisabledProfiles; 00348 00350 ProfileBarList mProfileBars; 00351 00353 bool mInitialized; 00354 00356 uint maxProfiles; 00357 00359 Overlay* mOverlay; 00360 00362 GuiContainer* mProfileGui; 00363 00365 Real mBarHeight; 00366 00368 Real mGuiHeight; 00369 00371 Real mGuiWidth; 00372 00374 Real mBarIndent; 00375 00377 Real mGuiBorderWidth; 00378 00380 Real mBarLineWidth; 00381 00384 uint mUpdateDisplayFrequency; 00385 00387 uint mCurrentFrame; 00388 00390 Timer* mTimer; 00391 00393 ulong mTotalFrameTime; 00394 00396 bool mEnabled; 00397 00400 bool mEnableStateChangePending; 00401 00404 bool mNewEnableState; 00405 00406 }; // end class 00407 00408 } // end namespace 00409 00410 #endif
Copyright © 2002-2003 by The OGRE Team
Last modified Sun Nov 28 19:48:39 2004