[디자인 패턴] #8_게임 루프, Game Loop Pattern
게임 디자인 패턴 중 "순서 패턴"에 대해 알아보겠습니다.
"게임 프로그래밍 패턴"의 9 항목, "게임 루프"에 해당하는 내용입니다.
게임 루프
1. 사용 목적
* Why?
: 게임 시간 진행을 유저 입력과 프로세서의 속도와 디커플링 합니다.
2. 개념
사용자 입력을 기다리는 동안 루프가 계속 돌며 게임을 진행합니다.
루프가 얼마나 빠르게 돌았는지에 따라서 "FPS"가 측정되며,
어떠한 플랫폼에서도 일정한 속도를 유지하는 것이 주요합니다!
코드 예제
1. 게임 루프의 기본 형태
while(true)
{
processInput();
update();
render();
}
1. 사용자 입력 처리
2. 상태 업데이트
3. 화면에 그려내기
* 주의 : 게임 실행 속도를 제어할 수 없습니다! 하드웨어 혹은 플랫폼에 따라서 실행 속도가 상이합니다!
2. Sleep을 활용한 게임 루프
while(true)
{
float start = getCurrentTime();
processInput();
update();
render();
sleep(start + FPS - getCurrentTime()); // 시작한 시간 + 루프를 한번 돌때 걸린 시간 - 현재 시간
}
* 주의 : 게임 실행 속도가 과하게 빨리 지지 않도록 제어할 수 있지만, 느려지는 것을 제어할 수 없습니다.
3. 가변 시간 간격 업데이트
1. Update 중 정해진 시간만큼 "게임 시간"이 진행됩니다.
2. Update 중 "현실 시간"이 진행됩니다.
* 게임 진행 속도 > 현실 시간 속도 일 때, 게임이 느려집니다!
float lastTime = getCurrentTime();
while(true)
{
float current = getCurrentTime();
float elapsed = current - lasttTime;
processInput();
update(elapsed);
render();
lastTime = current;
}
1. 매 프레임마다 직전 업데이트 이후 "현실 시간"이 얼마나 지났는지 "elapsed"에 저장합니다.
2. "update()" 메서드에 "elapsed"를 넘겨주어 해당 시간만큼만 월드(게임 세계)의 상태를 업데이트합니다.
* 다양한 플랫폼 혹은 하드웨어 환경에서도 비슷한 속도로 게임이 진행됩니다.
* 주의 : 멀티 플레어 게임의 경우 다른 FPS 환경에서 같은 물체의 위치가 달라집니다! 오차 발생!
4. 고정 시간 간격 업데이트 + 가변 시간 간격 렌더링
double prev = getCurrentTime();
double lag = 0.0;
while(true)
{
double current = getCurrentTime();
double elapsed = current - prev; // 직전 Frame - 현재 시간
prev = current;
lag += elapsed;
processInput();
while(lag >= FPS) // 실제 시간보다 FPS가 뒤쳐질 때...
{
update();
lag -= FPS;
}
}
1. "월드의 시간 < 현실의 시간" 일 경우, 고정 시간 간격 동안 상태 업데이트를 여러 번 진행합니다.
2. 다 따라잡았다면, 그제야 결과를 렌더링 합니다.
* 주의 : 고정 시간 간격이 너무 짧아지는 것을 방지해야 합니다.
* 렌더링 간격이 불규칙해지기 때문에 Update와 Update 사이에 렌더링 되는 문제가 발생!
5. 렌더링 보간 적용
render( lag / FPS );
1. lag( 현재 시간 - FPS )가 0이 아닐 경우, update() 루프를 빠져나옵니다.
2. 남은 lag 값은 다음 프레임까지 남은 잔여 시간으로 "render()"에 "lag / FPS"를 넘겨줍니다.
3. "lag / FPS"는 보간 시간으로 목표 지점까지 이동하는 물체를 중간쯤에 렌더링 해주어 자연스러운 움직임 연출
플랫폼 제공의 게임 루프 vs 사용자 정의 게임 루프
1. 플랫폼 제공 혹은 게임 엔진 제공 이벤트 루프
* 장점
1. 간단하다, 최적화 고민이 없다.
2. 플랫폼과 잘 맞는다.
* 단점
1. 시간을 제어할 수 없다.
2. 사용자 정의 게임 루프
* 장점
1. 완전한 제어가 가능합니다.
* 단점
1. 플랫폼 혹은 게임 엔진과의 상호작용을 고려해야 합니다.
'언어 > 디자인 패턴' 카테고리의 다른 글
[디자인 패턴]#10_Sandbox Pattern, 샌드박스 패턴 (0) | 2022.09.12 |
---|---|
[디자인 패턴]#9_업데이트 패턴, Update Pattern (0) | 2022.09.04 |
[디자인 패턴]#7_이중 버퍼, Double Buffer (0) | 2022.08.21 |
[디자인 패턴]#6_상태 패턴, State Pattern (1) | 2022.08.20 |
[디자인 패턴]#5_싱글턴 패턴, Singleton Pattern (0) | 2022.08.02 |