센로그

1. Game Engine Architecture (1) 본문

게임/게임 엔진 기초

1. Game Engine Architecture (1)

seeyoun 2022. 12. 7. 01:11

◆ 게임 엔진이란

고퀄리티 게임을 쉽고 빠르게 개발하기 위한 방법이다

엄청난 프로그래밍 스킬이나 계산 리소스 없이도 사용 가능

 

Unity, Unreal 엔진 등등

 


◆ 게임 엔진의 구성

다른 컴퓨터 시스템들처럼, 게임엔진도 "계층" 구성

일반적으로 도구 모음 + 런타임 구성 요소

엄청 많은 시스템이 계층으로 구성되는데, 상위 계층이 바껴도 하위는 안바뀜

 

지금부터 그 <<계층>>에 대해 하나씩 볼 것임.

 


▶ Hardware Layer

타겟 하드웨어(실행될 하드웨어)를 설정함

Windows, Linux, 아이폰, 안드로이드, ... 에서 실행될 것이다!

 


▶ Device Drivers Layer

하드웨어를 다루기 위해 필요한 API 또는 low level 명령어

GPU 바꾸면 그래픽 드라이버 깔아야 함.

GTX 3080을 위한 명령어(데이터 내놔, 데이터 저장해, .. 이런 것)

 

OS나 하드웨어 공급업체에서 장치 드라이버를 제공함44

 


OS Layer

- 운체의 가장 큰역할! Application 단과 HW 단을 연결해줌. 최적화 연결
- 한 컴퓨터에서 여러 프로그램을 실행할 때 이것들을 지휘함

항상 실행중

 

- Windows는 동시에 실행하기 위해서 time sliced 방식 사용.(seamless하게. 우리 눈에 보이진 않게 엄청 빠르게)

- OS에서 내 게임에 어느정도 메모리 줄지 이런거 결정(다 쓸 순 없음. 다른 앱들이랑 같이 써야되니까)

단, 콘솔의 경우 게임에 특화된 기기이기 때문에, 다 쓸 수 있음(Full control)

 


3rd party SDKs Layer

남이 미리 잘~ 만들어 놓은 것들

게임 엔진이 자기 혼자 모든걸 다 만들어 쓸수는 없음

대부분의 게임엔진은 많은 써드파티 소프트웨어 SDK와 미들웨어들을 사용한다.

, 모든걸 직접구현한건 아니고 다른 친구들이 만든걸 갖다쓰는거임.

유니티가 물리엔진 구현하고 싶다고 직접 다 구현하긴 어려움. 어디 잘 만들어진 애들 갖다씀

 


▷ 3rd party SDKs - Graphics

그래픽스 분야 써드파티

OpenGL, libgcm, DirectX, Vulkan 등등 있음.
  • OpenGL: cross-language API(모바일, 패드, 리눅스….에서 다 쓸 수 있음. 라이벌인 다이렉트엑스는 윈도우에서만 쓸 수 있음). 2D, 3D 벡터 그래픽을 렌더링 하기위해 사용됨. 오픈소스 API
  • Libgcm : 플스3 그래픽 하드웨어에 사용되는 low level( == 완전 밑 단계까지 컨트롤 가능함.) 인터페이스. (콘솔 관련 인터페이스임)
  • DirectX : 오픈지엘의 라이벌. MS사의 그래픽스 써드파티 툴. MS사가 기술 지원 잘해줘서 우리나라에선 다이렉트엑스 많이씀. DirectX 12에서는 low level엄청 지원해줘서 진입 장벽 개높아진 대신에, 자유도 상승(오픈지엘은 low level 지원 잘 안해줌)
  • Vulkan: low level API 지원

 

 


▷ 3rd party SDKs - Data structures and Algorithms

자료구조 / 알고리즘 분야 써드파티

STL, Boost 등등 있음. 둘다 C++ 라이브러리

생각보다 게임개발시 자료구조가 중요함.  STL정도는 공부해보는거 추천~

 

  • STL : 자료 구조, 스트링, 입출력.. 등등의 알고리즘 제공
  • Boost++ : pseudo 랜덤변수, 선형대수, 멀티스레딩, 이미지처리.. 등 지원
  • Loki

 


3rd party SDKs - Collision and Physics

충돌 / 물리 처리 분야 써드파티

충돌은 A와 B의 intersection을 체크해주는 것.
그런데 이런 충돌 / 물리 작용이 엄~청 많을 때, 어떻게 처리할지를 최적화해서 만들어놓은 것임
  • Havok : 유명한 충돌 / 물리 엔진
  • PhysX : NVIDIA 사의 충돌 / 물리 엔진

 


 3rd party SDKs - Character animation

캐릭터 애니메이션 분야의 써드파티

어떻게하면 내 캐릭터를 자연스럽게 움직이게 할 수 있을까? 를 지원하는 써드파티들
인버스 키네마틱 같은 거 지원하기도 함.
  • Granny 
  • Spine : 2D 스켈레탈 애니메이션(사람처럼 뼈구조로 돼있는거)
  • Havok animation : 무료 애니메이션 SDK 제공

 


 Platform Independence Layer

내가 어떤 플랫폼을 사용하더라도 내 코드가 올바르게 동작하도록 하는 부분임

각자 전문분야가 다르니까, 드라이버를 잘 알면 C++잘모르는 경우가 대다수

그래서 맨날 모여서 같이 작업하기 어려움 ㅠㅠ

=> 잘 몰라도 쓸 수 있도록 연결해주는 느낌

 

밑에 있는 HW가 어떻게 동작하는지 몰라도 쓸 수 있도록 함.

 


 Platform Independence Layer - Delegation

플랫폼 독립 계층의 중요한 개념 - 위임

예를들어,

내가 Device.LoadData()를 쓰면, Deligation구조에 의해 Device PC, Mobile, Pad중에 가장 알맞은 걸 갖고옴
그러면 자동으로 Device가 저 세 개중에 하나로 세팅되는거임!

 


Platform Independence Layer - Wrapper function

Delegation의 수단 - Wrapper function

System Call을 할 때, 하드웨어와 독립적으로 작동하도록 할 수 있음
플랫폼이 다르다고 새로 나한테 맞게 구현할 필요없이 Wrapper function을 이용해 사용할 수 있음!

내가 어떤 function을 호출하는데, 플랫폼이 달라서 바로 못부를 때.
그런 애들을 Wrapping 해서 호출하면 부를 수 있게 되는 거.

 


▶ Core system Layer

무언가를 받아서 처리해서 내보내주는 시스템들

 


Core system Layer - Assertions

코어 시스템의 핵심 이슈 - Assertion 처리

에러 체크. 대규모 플젝시.

logical 실수나, 프로그래밍적으로 하면 안되는 것들을 Assertion을 통해서 잡을 수 있음
코드를 내가 다 알 때는 필요없음.
근데 대규모 프로젝트나 팀플 할 때는 내 옆사람이 어떤 오류를 만들었는지 잘 모르니까,

assert를 통해서 에러 체킹 한번씩 해주는 게 국룰~

 

ex) 메모리 해제 체크

 


 Core system Layer - Memory management

코어 시스템의 핵심 이슈 - 메모리 관리

메모리 관리. 빠르게 할당하고 해제하고, 파편화 막고 이런 거.

메모리 관리가 게임에 엄청 중요함!

게임 엔진은 보통 자신만의 메모리 관리법 가지고있음

 

 


 Core system Layer - Math library

코어 시스템의 핵심 이슈 - 수학 연산 처리

수학 연산을 빠르게 하기 위한 라이브러리
비트 연산같은 것도 포함되어있곤 함

사칙연산, 행렬, 루트 ...이런거 이외에도

게임에서 빛 렌더링 같은거도 다 수학 연산임. 많이 쓰임!

 


 Core system Layer - Custom Data structures and Algorithms

코어 시스템의 핵심 이슈 - 커스텀 자구, 알고리즘 처리

자료구조 및 알고리즘은 시스템마다 다 다르게 동작하기도 하기 때문에,
성능 더 좋게 또는 일관되기 하려고 우리가 직접 만들어서 쓰기도 함

STL에서 제공해주는 자료 구조는, 일반적인 것을 제공해줌

우리가 어떤 데이터를 쓸 지 알 수가 없기 때문.

 

게임에서 자주 사용되는 것들은 따로 있으니까, 그런 것들을 가지고 최적화 시킬 수 있음.

 


▶ Resource Manager Layer

게임을 만들 때 필요한 리소스들을 통일된 형태로 관리하기 위해서 사용함

 

"나"를 구성하려면, 스켈레탈 데이터, , 질감, , 소리, 애니메이션 ... 등등

나 하나를 렌더링하기위해 엄청 많은 리소스들이 연결되어 있기 때문에 관리하기 어려움!

게임엔진이 자동으로 이런 것들을 관리해주는 부분임.

 

하나의 큰 인터페이스로 관리를 해서, 이 친구만 봐도

지금 어떤 애들이 로딩되어있고, 어떤 애들이 메모리에 올라와 있고 이런 걸 한눈에 볼 수 있도록 함.

 

ex) Unity의 Asset Manager

 


▶ Redering Engine Layer

2D든 3D든, 화면에 무언가(텍스처, 이미지, 메시 등등)를 실제로 그리는 역할은 렌더링 엔진이 함

 

같은 수학연산을 사용한다 하더라도 색감이나 렌더링시간이 다르게 렌더링되기 때문에 선호하는 렌더러들이 따로있곤함

 


▷ Rendering Engine Layer - Low-level renderer

렌더링 엔진의 핵심 이슈 - Low level renderer

뭔가를 그릴 때, 아주 기본이 되는 친구들을 다루는 것

 

기본이 되는 게 어떤거냐?

  • Materials & Shaders
    - 재질, 재질에 따른 빛반사, ...
  • Graphics Device Interface 
    - DirectX, OpenGL이런거를 눈에보이는 지오메트리 데이터나 색감 데이터로 바꿔주는 걸 관리해줌
    - 키보드 입출력 설정 이런것도 해줌
  • Geometric primitives submission 
    - 무언가를 그릴 때 가장 기본이 되는 단위. 메시를 그릴 때 가장 기본이 되는 단위는 삼각형임.
    - GPU 입장에서는, 폴리곤이 primitive 이기도 함! (GPU에서 얘네를 다뤄서 연산할 때 최소 단위)
  • Camera
  • Viewports & Virtual screens
  • Static & Dynamic lighting
    - 스태틱 라이팅 : 움직이지 않는 형태의 라이팅 (형광등)
    - 다이나믹 라이팅 : 움직이는 라이팅 (태양, 파티클…)
  • Texture & Surface management

 

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

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
2. Game Engine Architecture (2)  (1) 2022.12.07
Comments