| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | #include "..\ebase.h"
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // <20><>һ֡<D2BB>뵱ǰ֡<C7B0><D6A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | static int s_nInterval = 0; | 
					
						
							|  |  |  |  | // <20><>Ϸ<EFBFBD><CFB7>ʼʱ<CABC><CAB1>
 | 
					
						
							|  |  |  |  | static float s_fTotalTime = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | float e2d::ETime::getTotalTime() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	return s_fTotalTime; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | int e2d::ETime::getDeltaTime() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	return s_nInterval; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #if _MSC_VER > 1600
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #include <thread>
 | 
					
						
							|  |  |  |  | #include <chrono>
 | 
					
						
							|  |  |  |  | using namespace std::chrono; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // <20><>Ϸ<EFBFBD><CFB7>ʼʱ<CABC><CAB1>
 | 
					
						
							|  |  |  |  | static steady_clock::time_point s_tStart; | 
					
						
							|  |  |  |  | // <20><>ǰʱ<C7B0><CAB1>
 | 
					
						
							|  |  |  |  | static steady_clock::time_point s_tNow; | 
					
						
							|  |  |  |  | // <20><>һ֡ˢ<D6A1><CBA2>ʱ<EFBFBD><CAB1>
 | 
					
						
							|  |  |  |  | static steady_clock::time_point s_tLast; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  |  | bool e2d::ETime::__init() | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	s_tStart = s_tLast = s_tNow = steady_clock::now(); | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  |  | 	return true; | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::ETime::__uninit() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::ETime::__updateNow() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	s_tNow = steady_clock::now(); | 
					
						
							|  |  |  |  | 	s_fTotalTime = static_cast<float>(duration_cast<milliseconds>(s_tNow - s_tStart).count()) / 1000.0f; | 
					
						
							|  |  |  |  | 	s_nInterval = static_cast<int>(duration_cast<milliseconds>(s_tNow - s_tLast).count()); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::ETime::__updateLast() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	s_tLast = s_tNow; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::ETime::__sleep() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
 | 
					
						
							|  |  |  |  | 	int nWaitMS = 16 - s_nInterval; | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD><EFBFBD><EFBFBD>̣߳<DFB3><CCA3>ͷ<EFBFBD> CPU ռ<><D5BC>
 | 
					
						
							|  |  |  |  | 	if (nWaitMS > 1) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		std::this_thread::sleep_for(milliseconds(nWaitMS)); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #else
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #include <mmsystem.h>
 | 
					
						
							|  |  |  |  | #pragma comment(lib, "winmm.lib")
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // ʱ<><CAB1>Ƶ<EFBFBD><C6B5>
 | 
					
						
							|  |  |  |  | static LARGE_INTEGER s_tFreq; | 
					
						
							|  |  |  |  | // <20><>ǰʱ<C7B0><CAB1>
 | 
					
						
							|  |  |  |  | static LARGE_INTEGER s_tNow; | 
					
						
							|  |  |  |  | // <20><>Ϸ<EFBFBD><CFB7>ʼʱ<CABC><CAB1>
 | 
					
						
							|  |  |  |  | static LARGE_INTEGER s_tStart; | 
					
						
							|  |  |  |  | // <20><>һ֡<D2BB><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
 | 
					
						
							|  |  |  |  | static LARGE_INTEGER s_tLast; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  |  | bool e2d::ETime::__init() | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  |  | 	bool bRet = false; | 
					
						
							|  |  |  |  | 	if (::timeBeginPeriod(1)) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		// <20><EFBFBD>ʱ<EFBFBD>侫<EFBFBD><E4BEAB>
 | 
					
						
							|  |  |  |  | 		if (::QueryPerformanceFrequency(&s_tFreq))	// <20><>ȡʱ<C8A1><CAB1>Ƶ<EFBFBD><C6B5>
 | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			if (::QueryPerformanceCounter(&s_tNow))		// ˢ<>µ<EFBFBD>ǰʱ<C7B0><CAB1>
 | 
					
						
							|  |  |  |  | 			{ | 
					
						
							|  |  |  |  | 				s_tStart = s_tLast = s_tNow; | 
					
						
							|  |  |  |  | 				bRet = true; | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	return bRet; | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::ETime::__uninit() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	::timeEndPeriod(1);	// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>侫<EFBFBD><E4BEAB>
 | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::ETime::__updateNow() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	::QueryPerformanceCounter(&s_tNow); | 
					
						
							|  |  |  |  | 	s_fTotalTime = static_cast<float>(s_tNow.QuadPart - s_tStart.QuadPart) / s_tFreq.QuadPart; | 
					
						
							|  |  |  |  | 	s_nInterval = static_cast<int>((s_tNow.QuadPart - s_tLast.QuadPart) * 1000LL / s_tFreq.QuadPart); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::ETime::__updateLast() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	s_tLast = s_tNow; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::ETime::__sleep() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
 | 
					
						
							|  |  |  |  | 	int nWaitMS = 16 - s_nInterval; | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD><EFBFBD><EFBFBD>̣߳<DFB3><CCA3>ͷ<EFBFBD> CPU ռ<><D5BC>
 | 
					
						
							|  |  |  |  | 	if (nWaitMS > 1) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		::Sleep(nWaitMS); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #endif // _MSC_VER > 1600
 |