센로그

2. Game Engine Architecture (2) 본문

게임/게임 엔진 기초

2. Game Engine Architecture (2)

seeyoun 2022. 12. 7. 02:01

▶ Scene Optimization Layer

실행중에 적절히 씬을 최적화

 


▷ Scene Optimizaion Layer - Frustrum cull

씬 최적화 기법 - Frustrum culling

카메라에 비치는 부분만 렌더링

 


▷ Scene Optimizaion Layer - Spatial subdivision

씬 최적화 기법 - Spatial subdivision

vertex들을 공간 단위로 구분해서, 얘는 어느 공간에 있는 애야! 라는걸 저장

 


▷ Scene Optimizaion Layer - LOD (Level of Detail)

씬 최적화 기법 - LOD (Level of Detail)


가까이 있으면 작고 많은 vertex 렌더링
멀리 있으면 크고 적은 vertex 렌더링

Popping 현상 : LOD vertex 크기 키울 때 갑자기 퐝 터지면서 나타나는 느낌.
 
거리별로 생긴거 저장해두고 꺼내와서 쓰는듯 함. (저장하는 데 메모리 필요)
 


▶ Visual Effects Layer

우리가 아는 그 머싯는 이펙트

아무래도 게임은 비쥬얼 엄청 중요하니까 많이 쓰게 되겟죠?

  • Particle system
  • Decal system
  • Lignt mapping and environment mapping
  • Dynamic shadows
  • Full-screen post effect

 
저거를 처리해서 렌더링 엔진에 넘기면, 걔가 다 처리해주는듯
low level renderer는 지가 직접 메테리얼이나 텍스처같은거 처리해서 렌더링하는거 의미
 


▶ Front end Layer

3D에서 사용되는 2D. (3D씬 내에서 2D로 렌더링)

3D 게임을 만들더라도 2D 그래픽들이 필요함
 


▷ Front end - HUD (Head-Up Display)

프론트엔드의 예시 - HUD

내가 3차원 어느 곳을 보고 있어도 화면 따라 움직이는 UI.

이런 것들은 2D 렌더링 됨
 


▷ Front end - Billboard

프론트엔드 예시 - 빌보드


방향에 따라 저장해놨던 2D 이미지 보여줌

 

빌보드: 나무에 리소스 많이 쓸 필욘 없는뎅.. 자연스럽게 하고싶다! 이럴때 사용
[방법]
3D이미지를 일단 각각 방향으로 프로젝션 시킴
→ 일단 내 눈앞에 프로젝션된 2d 이미지를 박고
→ 내가 움직이면 저 판떼기 동그랗게 둘러싸인 게 따라 움직이며 프로젝션된 것들을 렌더링함
→ 2D 이미지를 렌더링하는 것이기 때문에 적은 리소스로 렌더링 가능!
 


▶ Profiling and Debugging Layer

게임 엔진에서는 퍼포먼스에 대해 프로파일링 해야 하는 경우가 많음

메모리 누수 발생하면 대체 메모리 사용량 보면서 얘가 어디서 발생했는지 찾아내야 함
버그가 발견되면 어디서 발생된 건지 알아야 함
=> 프로파일링/디버깅 툴을 이용해 추적!!
 


▶ Collision & Physics Layer

Collision을 판단한 후, 어느 방향과 어떤 힘으로 맞았는가 하는 부분은 Physics에서 처리

둘은 잘 엮여있어야 함!


▷ Collision & Physics Layer  - Ragdoll physics

충돌 / 물리 처리의 예시 - 레그돌

사람 관절 고려해서 충돌 밑 물리 처리 해주는 것

연결되어 있는 부분, 최대로 돌아갈 수 있는 각도 .. 등을 고려해 알아서 현실적으로 처리
 


▶ Skeletal Animation Layer

사람처럼 생긴 메쉬들을 주로 처리함. 사람의 bone들을 다룸

 


게임에서 사용되는 5가지 타입의 애니메이션

  • Sprite/texture animation
    이미지 빨리 돌아가며 보여주기
  • Rigid body hierarchy animation
    Rigidbody 연결
  • Skeletal animation
    사람 모양
  • Vertex animation
    각각의 정점들(꼭짓점 느낌)이 서로 다른 애니메이션 갖도록 만든 것.
    정점 수가 많을수록 부드러워짐
  • Morph targets
    애니메이션 섞기 같은 거. 블렌드 스페이스 느낌인 듯

 


▷ Skeletal Animation Layer  - Forward kinematics

키네마틱의 종류 - 포워드 키네마틱

관절체의 위치가 어디 존재한다는 정보를 다 가지고있어서, 맨 끝단 까지 위치를 결정해주는 걸 의미

관절체들의 상대적인 위치가 필요함.
 
ex)
어깨 → 팔꿈치 → 손목
직접 하나하나 돌리고 움직여줘야 함


▷ Skeletal Animation Layer  - Inverse kinematics

키네마틱의 종류 - 인버스 키네마틱

뼈의 끝 점의 위치만 가지고 자연스럽게 움직이는 것

뼈에 대한 정보는 있는데, 전부 어디에 있다는 정보는 없음. 끝점의 위치만 있는 거
손이 여기 있고 발이 여기 있어! 라는 정보를 알고있음. 그럼 대충 이렇게 있는거같은데~? 하고
나머지 관절체의 정보를 역산해주는 것. 각각의 최대 회전값 같은 걸 수식으로 넣어두고, 최적의 값으로 찾는 것임
 
VR에서도 사용. 손발 센서 가지고 가상공간에 이렇게 생겼을거야! 하고 렌더링
 
ex)
손목 → 팔꿈치 → 어깨
손목 움직이면 알아서 적절하게 딸려옴


▷ Skeletal Animation Layer  - Additive animation

스켈레탈 애니메이션 구현 종류 - 애디티브 애니메이션

서로 다른 애니메이션을 결합한 것

걷기 anim + 장전 anim 을 Combine하면 → 걸으면서 장전 anim
 


▶ HID(Human Interface Devices) Layer

키보드, 마우스 등의 입력을 받는 부분

생각보다 직접 구현하려면 복잡함. 그러나 게임엔진에서 다 해주니까 ㄱㅊ~
 


▶ Online Multiplayer Layer

멀티 플레이, 네트워크 관련 지원해주는 부분

멀티 플레이는 Device 별 FPS도 고려해줘야 하고, 서로 Sync도 잘 맞춰줘야 하고... 구현하기 어려움
그래도 게임 엔진에서는 이런 걸 지원해줘야 하기 때문에, 그나마 쉽게 하기 위한 패키지들을 제공함
 
멀티 플레이에는 아래 세 가지 종류가 있음

  • Single-screen multiplayer
    물/불 게임처럼 한 화면으로 같이 하는거
  • Split-screen multiplayer
    화면 분할해서 같이 하는거
  • Networked multiplayer
    우리가 아는 멀티. 네트워크 통신하며 같이 하는거


▶ Gameplay Foundation Layer

게임에서 일어나는 Action들을 처리해주는 부분. Event, Script...

 
여기서부터는 우리가 실제 게임 만들 때 건드릴 부분들임!
 
Eventsystem과 Scripting system이 여기에 들어가있음.
즉, 실제 게임 플레이시 게임이 어떻게 동작하고, 어디서 이벤트가 발생하고, 플레이어 능력치.. 이런 것들을 여기서 처리함
프로그래머들이 봐야 하는 단과, 디자이너들이 봐야 하는 단들을 이어주기 위해 사용하는 게 Gameplay Foundation 단임.
 
물체 옮기고, 돌리고, .. 이런 것도 쉽게 할 수 있도록 지원해줌 (옛날엔 직접 vector값 넣어서 했어야 함)
 


▷ Gameplay Foundation Layer  - Event system

게임플레이 기초 레이어의 핵심 시스템 - 이벤트 시스템

게임 플레이시 일어나는 모든 사건들. 언리얼의 이벤트 시스템.

이벤트는 Event handler function에게 넘어감
나중에 처리할 수 있게 queue에 저장될 수 있음
 


▷ Gameplay Foundation Layer  - Scripting system

게임플레이 기초 레이어의 핵심 시스템 - 스크립팅 시스템

게임 엔진의 스크립팅 시스템은 보통 인터프리터 방식

 
언어의 두 가지 방식

  • Compiler
    소스코드를 컴파일해서 기계어로 바꿔서 실행
  • Interpreter
    소스코드를 기계어로 변환 안하고, 중간에 인터프리터 핸들링해주는 친구가 받아서 한줄씩 실행

 
컴파일러의 경우 추후에 바꿨을 때 다 새로 컴파일해야 하는데
인터프리터는 바뀐 블록만 새로 실행해주면 됨
 
장점 : 행위에 대한 결과를 빨리볼 수 있음.
단점 : 디버깅 어려움
 

※ 언리얼 엔진에서는 C++, Blueprint 두 가지 방식의 스크립팅 시스템 지원
블루프린트는 노드 기준으로 실행되고, 객체지향임. 시각적으로 흐름을 쉽게 볼 수 있음

 


▷ Gameplay Foundation Layer  - Artificial Intelligence Foundation

게임플레이 기초 레이어의 핵심 시스템 - AI

AI 시스템 지원해 줌

NPC 행동, Navigation 같은 거 지원.
게임 만들 때 AI는 많이 쓰일 수밖에 없음!
 


▶ Subsystems Layer

Terrain 렌더링, Water 시뮬레이션, 플레이어 Movement, Camera 설정, AI Path Finding(A*), ...

 
게임 엔진 구조의 맨 윗단.
프로그래머-디자이너가 협력해서 게임 자체의 특징을 구현하는 부분

'게임 > 게임 엔진 기초' 카테고리의 다른 글

6. Game Engine Support System (2)  (0) 2022.12.08
5. Game Engine Support System (1)  (1) 2022.12.08
4. Object-oriented programming (2)  (0) 2022.12.07
3. Object-oriented programming (1)  (0) 2022.12.07
1. Game Engine Architecture (1)  (1) 2022.12.07
Comments