www.pudn.com > zfxcengine-0.1.0.zip > ceProfile.cpp


// $Id: ceProfile.cpp,v 1.11 2005/09/03 14:24:14 kimmi Exp $ 
///////////////////////////////////////////////////////////////// 
// 
//  Module:     Core 
//  File:       ceProfile.cpp 
//  Created:    06.02.2005 
//  Author:     Kim Kulling aka kimmi 
// 
///////////////////////////////////////////////////////////////// 
#include  
#include  
#include "Core/ceDebug.h" 
#include "Core/ceProfile.h" 
#include "Core/ceMemManager.h" 
 
namespace ZFXCE { 
	//------------------------------------------------------------------------------ 
	ceProfile::ceProfile(ceTimer *pInst) 
	{ 
		PUSH_FUNCTION; 
 
		Init(); 
		ce_assert (NULL != pInst); 
		this->m_pTimer = pInst; 
	} 
	//------------------------------------------------------------------------------ 
	ceProfile::ceProfile() 
	{ 
		PUSH_FUNCTION; 
 
		Init(); 
		m_pTimer = new ceTimer(); 
		ce_assert (NULL != m_pTimer); 
		m_bOwn = TRUE; 
	} 
	//------------------------------------------------------------------------------ 
	ceProfile::~ceProfile() 
	{ 
		PUSH_FUNCTION; 
 
		Release(); 
		if (m_bOwn) { 
			delete m_pTimer; 
		} 
	} 
	//------------------------------------------------------------------------------ 
	void ceProfile::Init() 
	{ 
		PUSH_FUNCTION; 
 
		m_pTimer = NULL; 
		m_bOwn = true; 
		m_vCall.reserve(CE_PR_TIMELIMIT); 
		m_vElapsed.reserve(CE_PR_TIMELIMIT); 
		for (UINT i=0; i < CE_PR_TIMELIMIT; i++) { 
			BOOL set = FALSE; 
			UINT temp=0; 
			DOUBLE dTemp = 0.0; 
			m_vCall.push_back(temp); 
			m_vElapsed.push_back(temp); 
			m_vSet.push_back(set); 
			m_vCurrent.push_back(dTemp); 
		} 
	} 
	//------------------------------------------------------------------------------ 
	void ceProfile::Release() 
	{ 
		PUSH_FUNCTION; 
 
		bool bDump = false; 
		std::vector::iterator it; 
		for (it = m_vSet.begin(); it != m_vSet.end(); it++) { 
			if ((*it))  
				bDump = true; 
		} 
		if (bDump) 
			Dump(); 
 
		m_vSet.clear(); 
		m_vCall.clear(); 
		m_vElapsed.clear(); 
		m_vCurrent.clear(); 
	} 
	//------------------------------------------------------------------------------ 
	void ceProfile::Clear() 
	{ 
		PUSH_FUNCTION; 
 
		Release(); 
		Init(); 
	} 
	//------------------------------------------------------------------------------ 
	bool ceProfile::Start(const UINT uiNumber) 
	{ 
		PUSH_FUNCTION; 
 
		ce_assert (uiNumber < CE_PR_TIMELIMIT); 
		if (this->m_vSet[uiNumber]) { 
			const DOUBLE uiCurrent = m_pTimer->GetFrameInterval(); 
			m_vCurrent[uiNumber]   = uiCurrent; 
			m_vCall[uiNumber]      = m_vCall[uiNumber] + 1; 
			return true; 
		} 
 
		m_vCurrent[uiNumber] = m_pTimer->GetFrameInterval(); 
		m_vElapsed[uiNumber] = 0.0; 
		m_vSet[uiNumber]     = true; 
		m_vCall[uiNumber]    = m_vCall[uiNumber] + 1; 
 
		return true; 
	} 
	//------------------------------------------------------------------------------ 
	bool ceProfile::Stop(const UINT uiNumber) 
	{ 
		PUSH_FUNCTION; 
 
		ce_assert (uiNumber < CE_PR_TIMELIMIT); 
		if (this->m_vSet[uiNumber]) { 
			const DOUBLE Tick = m_pTimer->GetFrameInterval(); 
			m_vElapsed[uiNumber] += fabs(Tick - m_vCurrent[uiNumber]); 
			return true; 
		} 
		 
		return false;	 
	} 
	//------------------------------------------------------------------------------ 
	void ceProfile::Dump() 
	{ 
		PUSH_FUNCTION; 
 
		std::cout << "------------------------------------------------------------" << std::endl; 
		std::cout << "Profiler:" << "\t" << "Calls:" << "\t\t" <<"Elapsed: "<< std::endl; 
		std::cout << "------------------------------------------------------------" << std::endl; 
		for (int i=0; i < CE_PR_TIMELIMIT; i++) { 
			if (this->m_vSet[i]) { 
				std::cout << " " << i; 
				std::cout << "\t\t" << m_vCall[i] << "\t\t"; 
				const DOUBLE dElapsed = m_vElapsed[i]; 
				std::cout << dElapsed << std::endl; 
			} 
		} 
		 
		std::cout << "------------------------------------------------------------" << std::endl; 
		Clear(); 
	} 
	//------------------------------------------------------------------------------ 
 
} // Namespace ZFXCE