Game Loop
게임 진행 시간을 유저입력, 프로세서속도와 디커플링
while (true)
{
processInput();
update();
render();
}
* 간단하지만 플랫폼과 작업량에 따라 게임 진행 시간이 바뀜
#define MS_PER_FRAME 16
while (true)
{
clock_t start = clock();
processInput();
update();
render();
Sleep(start + MS_PER_FRAME - clock());
}
* 기준이 되는 프레임 속도 안에서 계산이 완료되면 쉬어줘서 전력효율 높임, 느려지는 게임에 대해서 대처 불가
clock_t lastTime = clock();
while (true)
{
clock_t current = clock();
clcok_t elapsed = current - lastTime;
processInput();
update(elapsed);
render();
lastTime = current;
}
* 현실 시간에 맞춰서 게임 진행 시간을 조절하지만 게임플레이가 불안정하고 코드가 비결정적(결과가 일정하지않음)
#define MS_PER_FRAME 16
clock_t lastTime = clock();
double lag = 0.0;
while (true)
{
clock_t current = clock();
clcok_t elapsed = current - lastTime;
lastTime = current;
lag = lag + elapsed;
processInput();
while (lag >= MS_PER_UPDATE)
{
update();
lag -= MS_PER_UPDATE;
}
render();
}
* 느리거나 빨라도 잘 적응!
cf) 보간
- 게임 상태 update는 거의 고정된 시간으로 일어남
- render는 시간적 여유가 되면 일어남
update와 render의 호출 빈도와 시간이 달라짐
-> update(A)와 update(B) 사이에 render가 발생하면 A상태로 render하기 때문에 다음 render에서 튀어보일 수 있음
따라서 마지막줄 render의 파라미터로
lag / MS_PER_UPDATE : update(A)와 update(B) 사이에 흐르던 시간만큼 0부터 1로 정규화된 값
를 넘겨주고 그 값으로 보간한다