728x90

1. 게임 루프 패턴 정의

  • 게임 시간 진행을 유저 입력, 프로세서 속도와 디커플링 하는 패턴.

 

2. 게임 루프 구현

	while ( true )
	{
		double start = GetCurrentTime();
		ProcessInput();
		Update();
		Render();

		// 프레임 레이드를 유지하기 위해, 다음 프레임까지 남은 시간을 기다린다.
		Sleep( start + MS_PER_FRAME - GetCurrentTime() );
	}
  • 게임이 60FPS로 돌린다면 한 프레임에 16ms가 주어진다.
  • Sleep() 함수로 한 프레임이 빨리 끝나더라도, 게임이 너무 빨라지지 않는다.
  • 하지만 한 프레임당 16ms가 넘는 경우에는 느려지는 것을 방지하지 못한다.

 

3. 업데이트 간격 따라잡기

고정 시간 간격으로 업데이트

	double previous = GetCurrentTime();
	double lag = 0.0; 	// 실제 시간이 얼마나 지났는지를 위한 변수

	while ( true )
	{
		double current = GetCurrentTime();
		double elapsed = current - previous;
		previous = current;
		lag += elapsed;

		ProcessInput();

		// 고정 시간 간격 방식으로 루프를 돌면서 실제 시간을 따라잡을 때까지 게임을 업데이트한다.
		while ( lag >= MS_PER_UPDATE )
		{
			Update();
			lag -= MS_PER_UPDATE;
		}
		
		// 업데이트와 렌더링 시점이 다른 경우 보간을 통해 게임 객체 랜더링을 진행한다.
		Render( lag / MS_PER_UPDATE );
	}
  • 이전 루프 이후로 실제 시간이 얼마나 지났는지를 확인한 후,
  • 게임의 '현재'가 실제 시간의 '현재'를 따라잡을 때까지 고정 시간 간격만큼 게임 시간을 여러 번 시뮬레이션한다.

 

반응형

+ Recent posts