/* ********************************************************************* * CProfileMgr * ÆÄÀÏ : ProfileMgr.cpp * ±â´É : * ÀÛ¼ºÀÏ : 2003.11.05 * history : wizardbug ( 2003.11.05) :: Gem3ÀÇ Profile SystemÀ» Caldron¿¡ ¸Â°Ô º¯Çü ********************************************************************** */ #include "./ProfileMgr.h" /*************************************************************************************************** ** ** CProfileObj ** ***************************************************************************************************/ /*********************************************************************************************** * INPUT: * * name - pointer to a static string which is the name of this profile node * * parent - parent pointer * * * * WARNINGS: * * The name is assumed to be a static pointer, only the pointer is stored and compared for * * efficiency reasons. * *=============================================================================================*/ Caldron::Base::CProfileObj::CProfileObj( const char * strName, CProfileObj * pParent ) : m_strName( strName ), m_iTotalCalls( 0 ), m_fTotalTime( 0 ), m_iStartTime( 0 ), m_iRecursionCounter( 0 ), m_pParent( pParent ), m_pChild( NULL ), m_pSibling( NULL ) { Reset(); } Caldron::Base::CProfileObj::~CProfileObj( void ) { delete m_pChild; delete m_pSibling; } /*********************************************************************************************** * INPUT: * * name - static string pointer to the name of the node we are searching for * * * * WARNINGS: * * All profile names are assumed to be static strings so this function uses pointer compares * * to find the named node. * *=============================================================================================*/ Caldron::Base::CProfileObj *Caldron::Base::CProfileObj::Get_Sub_Node( const char * strName ) { // Try to find this sub node CProfileObj * child = m_pChild; while ( child ) { if ( child->m_strName == strName ) { return child; } child = child->m_pSibling; } // We didn't find it, so add it CProfileObj * node = new CProfileObj( strName, this ); node->m_pSibling = m_pChild; m_pChild = node; return node; } void Caldron::Base::CProfileObj::Reset() { m_iTotalCalls = 0; m_fTotalTime = 0.0f; if ( m_pChild ) { m_pChild->Reset(); } if ( m_pSibling ) { m_pSibling->Reset(); } } void Caldron::Base::CProfileObj::Call() { m_iTotalCalls++; if (m_iRecursionCounter++ == 0) { Caldron::ProfileGetTicks(&m_iStartTime); } } bool Caldron::Base::CProfileObj::Return() { if ( --m_iRecursionCounter == 0 && m_iTotalCalls != 0 ) { __int64 time; Caldron::ProfileGetTicks(&time); time -= m_iStartTime; m_fTotalTime += (float)time / Caldron::ProfileGetTickRate(); } return ( m_iRecursionCounter == 0 ); } /*************************************************************************************************** ** ** CProfileChecker ** ***************************************************************************************************/ Caldron::Base::CProfileChecker::CProfileChecker( CProfileObj * pStart ) { m_pCurrentParent = pStart; m_pCurrentChild = m_pCurrentParent->Get_Child(); } void Caldron::Base::CProfileChecker::First(void) { m_pCurrentChild = m_pCurrentParent->Get_Child(); } void Caldron::Base::CProfileChecker::Next(void) { m_pCurrentChild = m_pCurrentChild->Get_Sibling(); } bool Caldron::Base::CProfileChecker::Is_Done(void) { return m_pCurrentChild == NULL; } void Caldron::Base::CProfileChecker::Enter_Child( int iIndex ) { m_pCurrentChild = m_pCurrentParent->Get_Child(); while ( (m_pCurrentChild != NULL) && (iIndex != 0) ) { iIndex--; m_pCurrentChild = m_pCurrentChild->Get_Sibling(); } if ( m_pCurrentChild != NULL ) { m_pCurrentParent = m_pCurrentChild; m_pCurrentChild = m_pCurrentParent->Get_Child(); } } void Caldron::Base::CProfileChecker::Enter_Parent( void ) { if ( m_pCurrentParent->Get_Parent() != NULL ) { m_pCurrentParent = m_pCurrentParent->Get_Parent(); } m_pCurrentChild = m_pCurrentParent->Get_Child(); } /*************************************************************************************************** ** ** CProfileMgr ** ***************************************************************************************************/ Caldron::Base::CProfileObj Caldron::Base::CProfileMgr::m_Root( "Root", NULL ); Caldron::Base::CProfileObj *Caldron::Base::CProfileMgr::m_pCurrentNode = &CProfileMgr::m_Root; int Caldron::Base::CProfileMgr::m_iFrameCounter = 0; __int64 Caldron::Base::CProfileMgr::m_iResetTime = 0; /*********************************************************************************************** * CProfileManager::Start_Profile -- Begin a named profile * * * * Steps one level deeper into the tree, if a child already exists with the specified name * * then it accumulates the profiling; otherwise a new child node is added to the profile tree. * * * * INPUT: * * name - name of this profiling record * * * * WARNINGS: * * The string used is assumed to be a static string; pointer compares are used throughout * * the profiling code for efficiency. * *=============================================================================================*/ void Caldron::Base::CProfileMgr::StartProfile( const char * strName ) { if (strName != m_pCurrentNode->Get_Name()) { m_pCurrentNode = m_pCurrentNode->Get_Sub_Node( strName ); } m_pCurrentNode->Call(); } /*********************************************************************************************** * CProfileManager::Stop_Profile -- Stop timing and record the results. * *=============================================================================================*/ void Caldron::Base::CProfileMgr::StopProfile( void ) { // Return will indicate whether we should back up to our parent (we may // be profiling a recursive function) if (m_pCurrentNode->Return()) { m_pCurrentNode = m_pCurrentNode->Get_Parent(); } } /*********************************************************************************************** * CProfileManager::Reset -- Reset the contents of the profiling system * * * * This resets everything except for the tree structure. All of the timing data is reset. * *=============================================================================================*/ void Caldron::Base::CProfileMgr::Reset( void ) { m_Root.Reset(); m_iFrameCounter = 0; Caldron::ProfileGetTicks(&m_iResetTime); } /*********************************************************************************************** * CProfileManager::Increment_Frame_Counter -- Increment the frame counter * *=============================================================================================*/ void Caldron::Base::CProfileMgr::Increment_Frame_Counter( void ) { m_iFrameCounter++; } /*********************************************************************************************** * CProfileManager::Get_Time_Since_Reset -- returns the elapsed time since last reset * *=============================================================================================*/ float Caldron::Base::CProfileMgr::Get_Time_Since_Reset( void ) { __int64 time; Caldron::ProfileGetTicks(&time); time -= m_iResetTime; return (float)time / Caldron::ProfileGetTickRate(); }