센로그
1. Game Engine Architecture (1) 본문
◆ 게임 엔진이란
고퀄리티 게임을 쉽고 빠르게 개발하기 위한 도구
- 엄청난 프로그래밍 스킬이나 계산 리소스 없이도 사용 가능
- 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와 상호작용 하기위한 인터페이스
- 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 |