[디자인 패턴]#8_게임 루프, Game Loop Pattern

2022. 8. 28. 21:37· 언어/디자인 패턴
목차
  1. [디자인 패턴] #8_게임 루프, Game Loop Pattern

[디자인 패턴] #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
  1. [디자인 패턴] #8_게임 루프, Game Loop Pattern
'언어/디자인 패턴' 카테고리의 다른 글
  • [디자인 패턴]#10_Sandbox Pattern, 샌드박스 패턴
  • [디자인 패턴]#9_업데이트 패턴, Update Pattern
  • [디자인 패턴]#7_이중 버퍼, Double Buffer
  • [디자인 패턴]#6_상태 패턴, State Pattern
Hardii2
Hardii2
Hardii2
개발 블로그
Hardii2
전체
오늘
어제
  • 분류 전체보기
    • 알고리즘
    • 웹 개발
      • Node.js
      • React
    • 게임개발
      • DirectX12
      • 관련 지식
      • Unreal C++
      • Unreal 블루프린트
    • 언어
      • Effective C++
      • Basic C++
      • 디자인 패턴
      • 자료구조
      • 기술 질문
    • 문제 풀이
      • BOJ 문제 풀이
      • Programmers 문제 풀이
      • geeksForgeeks 문제 풀이
    • 수학
      • 확률과 통계
      • 게임수학
    • 개인프로젝트
    • 그룹프로젝트
      • PM
      • Dev
    • Github

블로그 메뉴

  • 홈
  • 글쓰기

공지사항

인기 글

태그

  • 정렬
  • Effective C++
  • BFS
  • 알고리즘
  • 최단 경로
  • 우선순위 큐
  • C++
  • unreal
  • set
  • DP
  • stl
  • 개발
  • 디자인 패턴
  • 기술 질문
  • 그래프
  • 트리
  • Unreal Blueprint
  • BOJ
  • programmers
  • dfs

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Hardii2
[디자인 패턴]#8_게임 루프, Game Loop Pattern
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.