222 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
 | 
						|
/***************************************************************************************************
 | 
						|
**
 | 
						|
** Real-Time Hierarchical Profiling for Game Programming Gems 3
 | 
						|
**
 | 
						|
** by Greg Hjelstrom & Byon Garrabrant
 | 
						|
**
 | 
						|
***************************************************************************************************/
 | 
						|
 | 
						|
// Credits: The Clock class was inspired by the Timer classes in 
 | 
						|
// Ogre (www.ogre3d.org).
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#ifndef BT_QUICK_PROF_H
 | 
						|
#define BT_QUICK_PROF_H
 | 
						|
 | 
						|
#include "btScalar.h"
 | 
						|
#define USE_BT_CLOCK 1
 | 
						|
 | 
						|
#ifdef USE_BT_CLOCK
 | 
						|
 | 
						|
///The btClock is a portable basic clock that measures accurate time in seconds, use for profiling.
 | 
						|
class btClock
 | 
						|
{
 | 
						|
public:
 | 
						|
	btClock();
 | 
						|
 | 
						|
	btClock(const btClock& other);
 | 
						|
	btClock& operator=(const btClock& other);
 | 
						|
 | 
						|
	~btClock();
 | 
						|
 | 
						|
	/// Resets the initial reference time.
 | 
						|
	void reset();
 | 
						|
 | 
						|
	/// Returns the time in ms since the last call to reset or since 
 | 
						|
	/// the btClock was created.
 | 
						|
	unsigned long long int getTimeMilliseconds();
 | 
						|
 | 
						|
	/// Returns the time in us since the last call to reset or since 
 | 
						|
	/// the Clock was created.
 | 
						|
	unsigned long long int getTimeMicroseconds();
 | 
						|
	
 | 
						|
	unsigned long long int getTimeNanoseconds();
 | 
						|
 | 
						|
	/// Returns the time in s since the last call to reset or since 
 | 
						|
	/// the Clock was created.
 | 
						|
	btScalar getTimeSeconds();
 | 
						|
	
 | 
						|
private:
 | 
						|
	struct btClockData* m_data;
 | 
						|
};
 | 
						|
 | 
						|
#endif //USE_BT_CLOCK
 | 
						|
 | 
						|
typedef void (btEnterProfileZoneFunc)(const char* msg);
 | 
						|
typedef void (btLeaveProfileZoneFunc)();
 | 
						|
 | 
						|
btEnterProfileZoneFunc* btGetCurrentEnterProfileZoneFunc();
 | 
						|
btLeaveProfileZoneFunc* btGetCurrentLeaveProfileZoneFunc();
 | 
						|
 | 
						|
 | 
						|
 | 
						|
void btSetCustomEnterProfileZoneFunc(btEnterProfileZoneFunc* enterFunc);
 | 
						|
void btSetCustomLeaveProfileZoneFunc(btLeaveProfileZoneFunc* leaveFunc);
 | 
						|
 | 
						|
#ifndef BT_NO_PROFILE // FIX redefinition
 | 
						|
//To disable built-in profiling, please comment out next line
 | 
						|
//#define BT_NO_PROFILE 1
 | 
						|
#endif //BT_NO_PROFILE
 | 
						|
 | 
						|
#ifndef BT_NO_PROFILE
 | 
						|
//btQuickprofGetCurrentThreadIndex will return -1 if thread index cannot be determined, 
 | 
						|
//otherwise returns thread index in range [0..maxThreads]
 | 
						|
unsigned int btQuickprofGetCurrentThreadIndex2();
 | 
						|
const unsigned int BT_QUICKPROF_MAX_THREAD_COUNT = 64;
 | 
						|
 | 
						|
#include <stdio.h>//@todo remove this, backwards compatibility
 | 
						|
 | 
						|
#include "btAlignedAllocator.h"
 | 
						|
#include <new>
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
///A node in the Profile Hierarchy Tree
 | 
						|
class	CProfileNode {
 | 
						|
 | 
						|
public:
 | 
						|
	CProfileNode( const char * name, CProfileNode * parent );
 | 
						|
	~CProfileNode( void );
 | 
						|
 | 
						|
	CProfileNode * Get_Sub_Node( const char * name );
 | 
						|
 | 
						|
	CProfileNode * Get_Parent( void )		{ return Parent; }
 | 
						|
	CProfileNode * Get_Sibling( void )		{ return Sibling; }
 | 
						|
	CProfileNode * Get_Child( void )			{ return Child; }
 | 
						|
 | 
						|
	void				CleanupMemory();
 | 
						|
	void				Reset( void );
 | 
						|
	void				Call( void );
 | 
						|
	bool				Return( void );
 | 
						|
 | 
						|
	const char *	Get_Name( void )				{ return Name; }
 | 
						|
	int				Get_Total_Calls( void )		{ return TotalCalls; }
 | 
						|
	float				Get_Total_Time( void )		{ return TotalTime; }
 | 
						|
	void*			GetUserPointer() const {return m_userPtr;}
 | 
						|
	void			SetUserPointer(void* ptr) { m_userPtr = ptr;}
 | 
						|
protected:
 | 
						|
 | 
						|
	const char *	Name;
 | 
						|
	int				TotalCalls;
 | 
						|
	float				TotalTime;
 | 
						|
	unsigned long int			StartTime;
 | 
						|
	int				RecursionCounter;
 | 
						|
 | 
						|
	CProfileNode *	Parent;
 | 
						|
	CProfileNode *	Child;
 | 
						|
	CProfileNode *	Sibling;
 | 
						|
	void*	m_userPtr;
 | 
						|
};
 | 
						|
 | 
						|
///An iterator to navigate through the tree
 | 
						|
class CProfileIterator
 | 
						|
{
 | 
						|
public:
 | 
						|
	// Access all the children of the current parent
 | 
						|
	void				First(void);
 | 
						|
	void				Next(void);
 | 
						|
	bool				Is_Done(void);
 | 
						|
	bool                Is_Root(void) { return (CurrentParent->Get_Parent() == 0); }
 | 
						|
 | 
						|
	void				Enter_Child( int index );		// Make the given child the new parent
 | 
						|
	void				Enter_Largest_Child( void );	// Make the largest child the new parent
 | 
						|
	void				Enter_Parent( void );			// Make the current parent's parent the new parent
 | 
						|
 | 
						|
	// Access the current child
 | 
						|
	const char *	Get_Current_Name( void )			{ return CurrentChild->Get_Name(); }
 | 
						|
	int				Get_Current_Total_Calls( void )	{ return CurrentChild->Get_Total_Calls(); }
 | 
						|
	float				Get_Current_Total_Time( void )	{ return CurrentChild->Get_Total_Time(); }
 | 
						|
 | 
						|
	void*	Get_Current_UserPointer( void )			{ return CurrentChild->GetUserPointer(); }
 | 
						|
	void	Set_Current_UserPointer(void* ptr) {CurrentChild->SetUserPointer(ptr);}
 | 
						|
	// Access the current parent
 | 
						|
	const char *	Get_Current_Parent_Name( void )			{ return CurrentParent->Get_Name(); }
 | 
						|
	int				Get_Current_Parent_Total_Calls( void )	{ return CurrentParent->Get_Total_Calls(); }
 | 
						|
	float				Get_Current_Parent_Total_Time( void )	{ return CurrentParent->Get_Total_Time(); }
 | 
						|
 | 
						|
	
 | 
						|
 | 
						|
protected:
 | 
						|
 | 
						|
	CProfileNode *	CurrentParent;
 | 
						|
	CProfileNode *	CurrentChild;
 | 
						|
	
 | 
						|
 | 
						|
	CProfileIterator( CProfileNode * start );
 | 
						|
	friend	class		CProfileManager;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
///The Manager for the Profile system
 | 
						|
class	CProfileManager {
 | 
						|
public:
 | 
						|
	static	void						Start_Profile( const char * name );
 | 
						|
	static	void						Stop_Profile( void );
 | 
						|
 | 
						|
	static	void						CleanupMemory(void);
 | 
						|
//	{
 | 
						|
//		Root.CleanupMemory();
 | 
						|
//	}
 | 
						|
 | 
						|
	static	void						Reset( void );
 | 
						|
	static	void						Increment_Frame_Counter( void );
 | 
						|
	static	int						Get_Frame_Count_Since_Reset( void )		{ return FrameCounter; }
 | 
						|
	static	float						Get_Time_Since_Reset( void );
 | 
						|
 | 
						|
	static	CProfileIterator *	Get_Iterator( void );	
 | 
						|
//	{ 
 | 
						|
//		
 | 
						|
//		return new CProfileIterator( &Root ); 
 | 
						|
//	}
 | 
						|
	static	void						Release_Iterator( CProfileIterator * iterator ) { delete ( iterator); }
 | 
						|
 | 
						|
	static void	dumpRecursive(CProfileIterator* profileIterator, int spacing);
 | 
						|
 | 
						|
	static void	dumpAll();
 | 
						|
 | 
						|
private:
 | 
						|
 | 
						|
	static	int						FrameCounter;
 | 
						|
	static	unsigned long int					ResetTime;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#endif //#ifndef BT_NO_PROFILE
 | 
						|
 | 
						|
///ProfileSampleClass is a simple way to profile a function's scope
 | 
						|
///Use the BT_PROFILE macro at the start of scope to time
 | 
						|
class	CProfileSample {
 | 
						|
public:
 | 
						|
	CProfileSample( const char * name );
 | 
						|
 | 
						|
	~CProfileSample( void );
 | 
						|
};
 | 
						|
 | 
						|
#define	BT_PROFILE( name )			CProfileSample __profile( name )
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#endif //BT_QUICK_PROF_H
 | 
						|
 | 
						|
 |