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 );
}
- 이전 루프 이후로 실제 시간이 얼마나 지났는지를 확인한 후,
- 게임의 '현재'가 실제 시간의 '현재'를 따라잡을 때까지 고정 시간 간격만큼 게임 시간을 여러 번 시뮬레이션한다.
반응형
'Design Pattern > 게임 프로그래밍 패턴' 카테고리의 다른 글
[Design Pattern] 바이트 코드 패턴 (0) | 2022.08.02 |
---|---|
[Design Pattern] 업데이트 메서드 패턴 (0) | 2022.08.01 |
[Design Pattern] 상태 패턴 (0) | 2022.07.31 |
[Design Pattern] 싱글턴 패턴 (0) | 2022.07.30 |
[Design Pattern] 프로토타입 패턴 (0) | 2022.07.30 |