디자인 패턴/게임 프로그래밍 패턴

[게임 프로그래밍 패턴][9]게임 루프

우향우@ 2024. 4. 28. 09:29

개요

게임 루프는 게임의 매 프레임의 동작을 수행하기 위한 루프 패턴을 의미한다. 입력 처리, Update, Render를 반복하는 루프로 구현된다. 

 

기본

가장 기본적인 구현 방법은 입력 처리, Update, Render를 그냥 반복하는 것이다. 가장 간단하지만 처리 속도에 따라 게임의 속도가 달라진다는 문제가 있다.

 

빠르면 대기

위 방식에서 루프의 시작과 끝에서 걸린 시간을 측정하고, 즉 해당 프레임에 소모된 시간을 측정하고 Update에서 사용한 고정 시간보다 짧다면 그만큼 대기한후 다음 프레임으로 넘어가는 방식이다. cpu 속도가 빠른 경우에는 정상적인 속도로 진행된다.하지만 느리다면 여전히 게임의 속도도 느려진다.

 

가변 속도 방식

이전 프레임의 처리 시간을 저장해두고 다음 프레임의 update에 해당 시간을 넘겨주어 그 시간만큼 게임의 시간을 Update하는 방식이다. 처리 속도와 상관없이 고정된 게임 속도를 가진다. 하지만 Update의 처리 시간이 고정이 아니기에 비결정적이고 불안정할 수 있다. 

 

따라 잡기 방식

이전 프레임의 처리 시간을 lag이라는 변수에 저장하고 고정 시간 Update로 lag이 고정시간보다 작아질때까지 반복하여 Update를 수행한다. 그 후 Render를 하고 다음 프레임으로 넘어간다. 다음 프레임에선 lag에 다시 이전 프레임 시간을 더해 남은 시간을 소모한다. 이렇게 하면 update는 고정 시간으로 처리되면서 여러 처리 속도에서도 문제없이 처리된다. 다만 남은 lag시간에 의해 실제 경과 시간과 Render되는 게임 진행 시간이 조금씩 어긋나 렌더링이 조금씩 어긋나 보일 수 있다. 이를 방지하기위해 Render에 lag의 남은 시간을 넣어 그 시간만큼 지난후로 예측된 상태를 렌더링하면 이를 방지할 수 있다. 

이 방식도 Update의 게임 시간에 비해 cpu처리 속도가 충분히 빠르지 않다면 게임 시간이 점점 늦춰질 수 있다. 또한 계속 늦춰지는 것을 방지하기 위해 최대 루프회수 제한을 넣을 수도 있다.

 

 

 

참고서적

게임 프로그래밍 패턴