⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 profiler.cpp

📁 网络游戏龙族 完整的登陆器 C++ 源代码
💻 CPP
字号:
// Profiler.cpp: implementation of the CProFileMgrr class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Profiler.h"
#include "TextOutMgr.h"

bool g_IsActiveProFiler = false;
ProFileShowType g_ProFileType;
CProFileMgr g_ProFileMgr;
//////////////////////////////////////////////////////////////////////
// Glogal Function
//////////////////////////////////////////////////////////////////////

static inline void GetPerfCounter(LARGE_INTEGER &iCounter)
{
	DWORD dwLow,dwHigh;
	__asm {
		rdtsc
		mov	dwLow, eax
		mov	dwHigh, edx
	}
	iCounter.QuadPart = ( (unsigned __int64)dwHigh << 32 ) | (unsigned __int64)dwLow; 
}

//////////////////////////////////////////////////////////////////////
// CProFile
CProFile::CProFile()
{
	m_n64CounterStart.QuadPart	=0;
	m_n64CounterEnd.QuadPart		=0;
	m_dwCounter		=0;
	m_dwCurrent		=0;
	m_dwAverage		=0;
	m_dwMaximum		=0;
	m_dwMinimum		=999999;
	
	m_IsStart = false;
}

CProFile::~CProFile()
{

}

void CProFile::StartCounter()
{
	::GetPerfCounter(m_n64CounterStart);
//	assert( true != m_IsStart);
	m_IsStart = true;
}

void CProFile::StopCounter()
{
	::GetPerfCounter(m_n64CounterEnd);
	SetMaxMinTime();
	m_IsStart = false;
}

void CProFile::SetMaxMinTime()
{
	DWORD dwCurrent = GetCurrent();
	//m_dwMaximum < dwCurrent ? m_dwMaximum = dwCurrent : 
	if( m_dwMaximum < dwCurrent ) 
	{
		m_dwMaximum = dwCurrent;
	}
	if( !m_dwMinimum && m_dwMinimum > dwCurrent)
	{
		m_dwMinimum = dwCurrent;
	}

	m_dwAccumulator += dwCurrent;
	m_dwCounter++;
	m_dwAverage = m_dwAccumulator/m_dwCounter++;
}

// CProFile
//////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////
// CProFileMgr  


CProFileMgr::CProFileMgr()
{

}

CProFileMgr::CProFileMgr(const int nCounterNum)
{
//	Create( nCounterNum );
}

CProFileMgr::~CProFileMgr()
{
	Destory();
}

	
bool CProFileMgr::Create(const int nCounterNum)
{
	return true;
}

void CProFileMgr::Destory()
{
	//int nCount = GetCount();
	
	//for_each(m_mProFile.begin(), m_mProFile.end(), DeleteCounter );
	
	for(PROFILE_ITOR itor = m_mProFile.begin();itor != m_mProFile.end();itor++)
	{
		CProFile *pProFile = itor->second;
		if( NULL != pProFile )
		{
			delete pProFile;
		}

		//m_mProFile.erase(itor);
	}
	m_mProFile.clear();
}

bool CProFileMgr::AddCounter(string szParent, string szName)
{
	
	PROFILE_ITOR itor = m_mProFile.find( szName );
	
	if( itor != m_mProFile.end() )
	{
		//(*itor).second
		return false;
	}
	
	CProFile *pProFile =  new CProFile;
	pProFile->SetParentName(szParent);
	m_mProFile.insert( PAIR_PROFILE( szName, pProFile) );
/*
	ProFiler pProFiler;
	//memset( pProFiler->szCounterName, 0, 32 );
	strncpy( pProFiler.szCounterName, szCounterName, strlen( szCounterName ) );
	pProFiler.nCounterGroup = nCounterGroup;
	m_mProFile.insert( PAIR_PROFILE( nCounterID, pProFiler) );
*/
	
	return true;
}

bool CProFileMgr::AddCounter(const char* szParent, const char* szName)
{
	
	PROFILE_ITOR itor = m_mProFile.find( szName );
	
	if( itor != m_mProFile.end() )
	{
		//(*itor).second
		return false;
	}
	
	CProFile *pProFile =  new CProFile;
	pProFile->SetParentName(szParent);
	m_mProFile.insert( PAIR_PROFILE( szName, pProFile) );
	
	return true;
}

int CProFileMgr::GetCounterID(int nCounterGroup, const char* szCounterName)
{
	/*
	for( int i=0;i< m_nMaxCounterNum;i++)
	{
		if( NULL == m_ProFiler[i].szCounterName )
		{
			SetCounter(i, nCounterGroup, szCounterName );
			return i;
		}
	}
	return -1;
	*/
	return 1;
}

bool CProFileMgr::DeleteCounter(string szName)
{
	
	PROFILE_ITOR itor = m_mProFile.find( szName );
	
	if( itor == m_mProFile.end() )
	{
		return false;
	}

	CProFile *pProFile = itor->second;
	if( NULL != pProFile )
	{
		delete pProFile;
	}

	m_mProFile.erase(itor);
	return true;
}

void CProFileMgr::StartCounter(string szName)
{
	m_mProFile[szName]->StartCounter();
}

void CProFileMgr::StopCounter(string szName)
{
	m_mProFile[szName]->StopCounter();
}

void CProFileMgr::Init()
{
	m_mProFile.clear();
	m_dwCpuClock = 1;
	m_dwCpuClock = GetCpuClock() / CLOCK_TIME; //ms肺 拌魂
}

DWORD CProFileMgr::GetCpuClock()
{
	LARGE_INTEGER	StartTime, EndTime;
	DWORD dwClock=0;
	for( int i =0; i< CLOCK_LOOP; i++)
	{
		GetPerfCounter( StartTime );
		Sleep(CLOCK_TIME);
		GetPerfCounter( EndTime );		
		dwClock += (EndTime.QuadPart - StartTime.QuadPart)/CLOCK_TIME;
	}
	return dwClock/CLOCK_LOOP;
}

const char* CProFileMgr::GetShowingBuffer(const char* szName)
{
	if( NULL == szName || !IsExist(szName) )
	{
		return NULL;
	}

	char *buf = new char[0xff];
	sprintf( buf, "%s_%s\n   Curent:%10d\n   Max:%10d\n   Aver:%10d\n   Min:%10d\n    %3.2f %%",
		GetParentName(szName), szName, GetCurrTime(szName), GetMaxTime(szName), GetAverTime(szName), GetMinTime(szName), GetRate(szName) );
	return buf;
}

void CProFileMgr::DrawCounter()
{
	int i =0;
	for(PROFILE_ITOR it = m_mProFile.begin();it != m_mProFile.end(); it++)
	{
		TxtOut.RcTXTOutBNoBG(200+i++*120, 100, 500,1,"%s", GetShowingBuffer((it)->first.c_str()) );		
	}
}

enum {
	PF_TOP = 180,
	PF_LEFT = 100,

	PF_X_SIZE = 100,
	PF_Y_SIZE = 20,
};

void CProFileMgr::DrawCounter(ProFileShowType sType)
{
	if( !g_IsActiveProFiler )	// active惑怕俊辑父 焊咯霖促. 
	{
		return;
	}

	int i =0, j=0;
	for(PROFILE_ITOR it = m_mProFile.begin();it != m_mProFile.end(); it++)
	{
		
		if( sType.bParent )
		{
			TxtOut.RcTXTOutBNoBG(PF_TOP+(PF_X_SIZE*i), PF_LEFT+(PF_Y_SIZE*++j), 100,1,"%s", GetParentName((it)->first.c_str()) );		
		}
		TxtOut.RcTXTOutBNoBG(PF_TOP+(PF_X_SIZE*i), PF_LEFT+(PF_Y_SIZE*++j), 100,1,"%s",(it)->first.c_str() );
		if( sType.bCurrent)
		{
			TxtOut.RcTXTOutBNoBG(PF_TOP+(PF_X_SIZE*i), PF_LEFT+(PF_Y_SIZE*++j), 100,1,"%d", GetCurrTime((it)->first.c_str()) );		
		}
		if( sType.bMax )
		{
			TxtOut.RcTXTOutBNoBG(PF_TOP+(PF_X_SIZE*i), PF_LEFT+(PF_Y_SIZE*++j), 100,1,"%d", GetMaxTime((it)->first.c_str()) );		
		}
		if( sType.bAvr )
		{
			TxtOut.RcTXTOutBNoBG(PF_TOP+(PF_X_SIZE*i), PF_LEFT+(PF_Y_SIZE*++j), 100,1,"%d", GetAverTime((it)->first.c_str()) );		
		}
		if( sType.bMin )
		{
			TxtOut.RcTXTOutBNoBG(PF_TOP+(PF_X_SIZE*i), PF_LEFT+(PF_Y_SIZE*++j), 100,1,"%d", GetMinTime((it)->first.c_str()) );		
		}
		if( sType.bRate )
		{
			TxtOut.RcTXTOutBNoBG(PF_TOP+(PF_X_SIZE*i), PF_LEFT+(PF_Y_SIZE*++j), 100,1,"%3.2f%%", GetRate((it)->first.c_str()) );		
		}
		i++;j=0;
	}
}

// CProFileMgr
//////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -