2
/***************************************************************************************************
4
** Real-Time Hierarchical Profiling for Game Programming Gems 3
6
** by Greg Hjelstrom & Byon Garrabrant
8
***************************************************************************************************/
10
// Credits: The Clock class was inspired by the Timer classes in
11
// Ogre (www.ogre3d.org).
15
#ifndef BT_QUICK_PROF_H
16
#define BT_QUICK_PROF_H
18
//To disable built-in profiling, please comment out next line
19
//#define BT_NO_PROFILE 1
21
#include <stdio.h>//@todo remove this, backwards compatibility
23
#include "btAlignedAllocator.h"
30
#define USE_BT_CLOCK 1
34
///The btClock is a portable basic clock that measures accurate time in seconds, use for profiling.
40
btClock(const btClock& other);
41
btClock& operator=(const btClock& other);
45
/// Resets the initial reference time.
48
/// Returns the time in ms since the last call to reset or since
49
/// the btClock was created.
50
unsigned long int getTimeMilliseconds();
52
/// Returns the time in us since the last call to reset or since
53
/// the Clock was created.
54
unsigned long int getTimeMicroseconds();
56
struct btClockData* m_data;
64
///A node in the Profile Hierarchy Tree
68
CProfileNode( const char * name, CProfileNode * parent );
69
~CProfileNode( void );
71
CProfileNode * Get_Sub_Node( const char * name );
73
CProfileNode * Get_Parent( void ) { return Parent; }
74
CProfileNode * Get_Sibling( void ) { return Sibling; }
75
CProfileNode * Get_Child( void ) { return Child; }
82
const char * Get_Name( void ) { return Name; }
83
int Get_Total_Calls( void ) { return TotalCalls; }
84
float Get_Total_Time( void ) { return TotalTime; }
91
unsigned long int StartTime;
94
CProfileNode * Parent;
96
CProfileNode * Sibling;
99
///An iterator to navigate through the tree
100
class CProfileIterator
103
// Access all the children of the current parent
107
bool Is_Root(void) { return (CurrentParent->Get_Parent() == 0); }
109
void Enter_Child( int index ); // Make the given child the new parent
110
void Enter_Largest_Child( void ); // Make the largest child the new parent
111
void Enter_Parent( void ); // Make the current parent's parent the new parent
113
// Access the current child
114
const char * Get_Current_Name( void ) { return CurrentChild->Get_Name(); }
115
int Get_Current_Total_Calls( void ) { return CurrentChild->Get_Total_Calls(); }
116
float Get_Current_Total_Time( void ) { return CurrentChild->Get_Total_Time(); }
118
// Access the current parent
119
const char * Get_Current_Parent_Name( void ) { return CurrentParent->Get_Name(); }
120
int Get_Current_Parent_Total_Calls( void ) { return CurrentParent->Get_Total_Calls(); }
121
float Get_Current_Parent_Total_Time( void ) { return CurrentParent->Get_Total_Time(); }
125
CProfileNode * CurrentParent;
126
CProfileNode * CurrentChild;
128
CProfileIterator( CProfileNode * start );
129
friend class CProfileManager;
133
///The Manager for the Profile system
134
class CProfileManager {
136
static void Start_Profile( const char * name );
137
static void Stop_Profile( void );
139
static void CleanupMemory(void)
141
Root.CleanupMemory();
144
static void Reset( void );
145
static void Increment_Frame_Counter( void );
146
static int Get_Frame_Count_Since_Reset( void ) { return FrameCounter; }
147
static float Get_Time_Since_Reset( void );
149
static CProfileIterator * Get_Iterator( void )
152
return new CProfileIterator( &Root );
154
static void Release_Iterator( CProfileIterator * iterator ) { delete ( iterator); }
156
static void dumpRecursive(CProfileIterator* profileIterator, int spacing);
158
static void dumpAll();
161
static CProfileNode Root;
162
static CProfileNode * CurrentNode;
163
static int FrameCounter;
164
static unsigned long int ResetTime;
168
///ProfileSampleClass is a simple way to profile a function's scope
169
///Use the BT_PROFILE macro at the start of scope to time
170
class CProfileSample {
172
CProfileSample( const char * name )
174
CProfileManager::Start_Profile( name );
177
~CProfileSample( void )
179
CProfileManager::Stop_Profile();
184
#define BT_PROFILE( name ) CProfileSample __profile( name )
188
#define BT_PROFILE( name )
190
#endif //#ifndef BT_NO_PROFILE
194
#endif //BT_QUICK_PROF_H