센로그

1. Game Engine Architecture (1) 본문

게임/게임 엔진 기초

1. Game Engine Architecture (1)

seeyoun 2022. 12. 7. 01:11

◆ 게임 엔진이란

고퀄리티 게임을 쉽고 빠르게 개발하기 위한 도구
  • 엄청난 프로그래밍 스킬이나 계산 리소스 없이도 사용 가능
  • Unity, Unreal 엔진 등등

 


◆ 게임 엔진의 구성

게임 엔진은 일반적으로 도구들 + 런타임 구성 요소로 구성됨

다른 컴퓨터 시스템들처럼, 게임엔진도 내부적으로 "계층적"으로 구성되어 있음

 

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

 

지금부터 각 계층들에 대해 하나씩 알아볼 것임. (하위계층부터~!)

 


▶ Hardware Layer

타겟 하드웨어(게임이 실행될 하드웨어)

 

게임이 어떤 하드웨어에서 실행될 것인지 결정.

  • pc, 태블릿, 스마트폰 ...

 


▶ Device Drivers Layer

HW를 다루기 위한 SW

 

드라이버란, 하드웨어를 다루기 위해 필요한 API 또는 low level 명령어를 제공해주는 low-level 소프트웨어

하드웨어의 1차적인 쉴드 역할을 해주기도 함

 

보통 드라이버는 OS에 내장되어있거나, 하드웨어 제조업체가 직접 제공함.

  • 예를 들어, GPU 바꾸면 이에 맞는 그래픽 드라이버 깔아야 함.
  • 이는 해당 GPU를 위한 명령어(데이터 내놔, 데이터 저장해, .. 이런 것)를 제공함.

 


OS Layer

Application 단과 HW 단 사이의 중재자 역할을 수행

 

운체의 가장 큰역할! Application 단과 HW 단을 연결해 줌. 

자원 관리, 프로세스 관리, 파일 관리 등을 함.

 

  • Windows는 보통 OS 스케쥴링 시 time sliced 방식 사용.(여러 작업들을 엄청 빠르게 전환하며 수행)
  • OS에서 이 게임에 메모리를 얼마나 할당할지 결정함. (내가 다 쓸 순 없음. 다른 앱들이랑 같이 써야되니까)
    • 단, 콘솔의 경우 게임에 특화된 기기이기 때문에, 다 쓸 수 있음 (풀 컨트롤이 가능함)
      그래서 개발이 더 쉬울 수도 있음.
    • 그러나 요즘  xbox, 플스 같은 시리즈는 네트워킹 기능이나 다른 기능이 많아져서, 풀 컨트롤이 불가능하기도 함.
      그래서 비교적 개발이 더 어렵기도 함.

 


3rd party SDKs Layer

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

 

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

당연함. 모든 기능들을 자체적으로 구현할 수는 없다. 어렵기도 하고 비효율적.

 

보통 그래픽스, 자료구조/알고리즘, 충돌/물리처리, 애니메이션 분야에서 써드파티를 많이 쓴다.

 

어떤 게 있는지 유명한 것들 설명 드간다.

 


▷ 3rd party SDKs - Graphics

  • OpenGL
    • cross-language API (Windows, Linux... 상관 없이 다 쓸 수 있음)
    • 오픈소스 API
  • DirectX
    • MS사가 개발한 툴로, Windows에서만 쓸 수 있음.
    • DirectX 12에서는 low level 엄청 지원해줘서 진입 장벽 개높아진 대신에, 자유도 상승
      (OpenGL low level 지원 잘 안해줌)
  • Libgcm
    • 콘솔 관련 인터페이스.
    • low level까지 컨트롤 가능
    • 플스3 그래픽 하드웨어에 사용
  • Vulkan
    • low level API 지원

 

 


▷ 3rd party SDKs - Data structures and Algorithms

생각보다 게임개발시 자료구조가 중요함. 

STL정도는 따로 공부해보는거 추천~

 

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

 


3rd party SDKs - Collision and Physics

충돌은 A와 B의 intersection(교차)을 체크해주는 것을 의미함.
그런데 이런 충돌이나 물리 작용이 엄~청 많을 때, 어떻게 처리할지를 최적화해서 만들어놓은 것임

 

유명한 충돌/물리 엔진으로 다음 두 가지 정도가 있다.

  • Havok 
  • PhysX
    • NVIDIA 사가 개발

 


 3rd party SDKs - Character animation

캐릭터에 자연스러운 애니메이션을 적용할 수 있도록 지원하는 써드파티들
충돌 처리와 관련이 있기도 하고, IK 같은 거 지원하기도 함.

 

  • Granny 
    • 3D
  • Spine
    • 2D 스켈레탈 애니메이션 지원하는 툴
  • Havok animation
    • 물리 기반 애니메이션이 자연스럽게 동작하도록 돕는 SDK

 


 Platform Independence Layer

특정 하드웨어나 운영체제에 종속되지 않고, 플랫폼 독립적으로 작동하도록 하는 부분.

 

하드웨어의 차이를 엔진의 나머지 부분에서 숨겨줌

이렇게 하면 어떤 하드웨어에서 실행하더라도 일관된 동작을 보장할 수 있음.

  • 예를 들어, 특정 플랫폼에서 그래픽, 입력 장치, 사운드 시스템 등 다양한 기능이 조금씩 다르더라도 게임 엔진이 동일하게 동작하도록 해줌

 

플랫폼 독립을 구현하기 위한 관련 개념으로 Delegation, Wrapper function을 알아둘만 함.

 


 Platform Independence Layer - Delegation

플랫폼 독립을 어떻게 구현하느냐? Delegation 방식을 통해서 구현함.

 

  • 나는 어떤 플랫폼에서 쓰든 상관 없이 그냥 Device.LoadData()만 호출하면 됨.
  • 호출되면, Deligation 패턴에 의해 Device PC, Mobile, Pad중에 가장 알맞은 걸 갖고옴
  • 그러면 자동으로 Device가 저 세 개중에 하나로 세팅되며 적절하게 LoadData()를 할 수 있게 됨.

 


Platform Independence Layer - Wrapper function

특정 기능을 호출할 때, 중간에서 간접적으로 처리해주는 함수

 

그러면 이런 Delegation을 어떻게 하느냐? Wrapper function을 사용하는 것임.

 

여기서 Device.LoadData() 가 Wrapper function인 거임.

 

자주 사용되는 C 표준 라이브러리 함수, 시스템 콜, 주요 API 호출 시 Wrapper Function을 사용해서 호출하도록 함.

이를 통해 기능들이 플랫폼 독립적으로 작동하도록 함.

 

  • 예를들어 사용자가 직접 시스템 콜을 하지 않고, Wrapper Function을 통해 간접적으로 호출하도록 함.
  • 그러면 플랫폼 독립적으로 시스템 콜을 할 수 있음.
    윈도우와 리눅스의 파일 입출력 방식이 다르더라도, 동일한 방식으로 처리할 수 있는 것임.

 


▶ Core system Layer

assertion 처리, 메모리 관리, 수학 연산 처리, ... 등 중요한 sw 유틸리티를 제공하는 부분

 

대표적으로 이런 기능들을 함

  • Assertion 처리
  • 메모리 관리
  • 수학 연산 라이브러리
  • 커스텀 자료구조, 알고리즘

 


Core system Layer - Assertions

assertion 처리를 지원해줌

 

logical 실수나, 프로그래밍적으로 하면 안되는 것들, 메모리 해제했는지 같은 것을 Assertion을 통해서 잡을 수 있음


솔직히 코드를 내가 다 알 때는 굳이 필요없음.
근데 대규모 프로젝트나 팀플 할 때는 내 옆사람이 어떤 오류를 만들었는지 잘 모르니까,

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

이런 걸 게임 엔진에서 지원해준다는 것임

 


 Core system Layer - Memory management

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

 

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

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

  • 유니티같은 경우 GC 사용.

 


 Core system Layer - Math library

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

 

게임엔진에서는 어떻게 하면 수학 연산을 빠르게 할까? 도 중요함.

 

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

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

 

따라서 최대한 빠르게 수행해야 함. 이를 도와주기 위한 라이브러리

 


 Core system Layer - Custom Data structures and Algorithms

자료 구조나 알고리즘을 성능 더 좋게 또는 일관되게 하려고 직접 만들어서 쓰기도 함

 

STL에서 제공해주는 자료 구조나 알고리즘들은 주로 일반적인 것들임.

성능보다는 일반화에 초점을 둔 것.

 

그러나 게임에서 자주 사용되는 것들은 따로 있으므로, 성능을 위해 직접 구현해서 사용하기도 함.

 

게임 엔진이 성능을 최적화하고 특정 플랫폼에서 안정적으로 작동하도록, 기본 자료 구조와 알고리즘을 직접 구현하는 경우가 많음.

 


▶ Resource Manager Layer

리소스들을 통일된 형태로 관리하기 위해 사용하는 툴.

 

예를들어 "나"를 구성하려면, 스켈레탈 데이터, , 질감, , 소리, 애니메이션 ... 등등 엄청 많은 게 언결되어 있음.

때문에 관리하기 어려움!

 

게임엔진은 자동으로 관련된 리소스들을 연결하여 관리해 줌.

 

리소스 매니저를 통해서 하나의 큰 인터페이스로 관리를 하기 때문에

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

 

ex) Unity의 Asset Manager

 


▶ Redering Engine Layer

화면에 무언가(텍스처, 이미지, 메시 등등)를 실제로 그리는 역할

 

렌더러가 이 기능을 수행함.

 

참고로, 같은 수학연산을 사용한다 하더라도 색감이나 렌더링시간이 다르게 렌더링되기 때문에,

엔진별로 선호하는 렌더러가 따로있곤함

 


▷ Rendering Engine Layer - Low-level renderer

게임 엔진의 기본적인 렌더링 기능을 담당하는 low level구성 요소

 

이 시스템은 최대한 빠르고 풍부하게 기하학적 기본 요소(primitive)를 렌더링하는 데 초점을 맞추고 있음

 

 

기본적인 렌더링 기능이 어떤거냐?

  • Materials & Shaders
    • 재질, 재질에 따른 빛반사, ...
  • Graphics Device Interface 
    • DirectX, OpenGL 등 그래픽 SDK와 상호작용 하기위한 인터페이스
  • Geometric primitives submission 
    • primitive를 렌더러에 제출
    • primitive란 무언가를 그릴 때 가장 기본이 되는 단위. 메시를 그릴 때 가장 기본이 되는 단위는 삼각형임.
      • 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