반응형


double	g_timePerFrame;// 임의로 정해놓은 프레임 제한시간


int APIENTRY WinMain(
	HINSTANCE a_hInst, 
	HINSTANCE a_hPrevInst, 
	LPSTR a_lpszCmdParam, 
	int a_iCmdShow)
{	
	//윈도우 클래스 등록
	if (!InitWndClass(a_hInst))
	{
		return false;
	}

	//윈도우 생성 및 화면에 보여주기
	if (!InitInstance(a_hInst, a_iCmdShow))
	{
		return false;
	}

	
	MSG Message;

	std::chrono::system_clock::time_point worktime_old = std::chrono::system_clock::now();
	std::chrono::system_clock::time_point worktime_now;
	g_timePerFrame = 200.0; 
	while (1)
	{
		if (PeekMessage(&Message, 0, 0, 0, PM_REMOVE))
		{
			if (Message.message == WM_QUIT || Message.message == WM_DESTROY)
			{
				break;
			}
			TranslateMessage(&Message);
			DispatchMessage(&Message);
		}
		else
		{
			worktime_now = std::chrono::system_clock::now();

			//루프가 끝나고, 다시 시작하는 시점 까지의 경과시간(공백시간)
			std::chrono::duration<double, std::milli> work_time = worktime_now - worktime_old; 
            
			if (work_time.count() < g_timePerFrame)
			{
				double d = g_timePerFrame - work_time.count(); //임의로 정해놓은 프레임 제한시간에서 실제 프레임당 걸리는 시간을 빼준다, 그렇게 남는시간은
				std::chrono::duration<double, std::milli> sleepTime(d);
				std::chrono::milliseconds sleepTime_ms_duration = std::chrono::duration_cast<std::chrono::milliseconds>(sleepTime);
				std::this_thread::sleep_for(sleepTime_ms_duration); // 해당 thread를 sleep 시키는 시간으로 쓴다
			}
			worktime_old = std::chrono::system_clock::now();
			
            
			//ToDo : GameLogic 처리 Update, Rendering
		}
	}
	return Message.wParam;

}
반응형

+ Recent posts