1.1 게임 팀 구성

1.1.1 엔지니어

엔지니어는 게임을 만드는데 쓰이는 소프트웨어와 툴을 만든다.

 

엔진과 게임을 개발하는 런타임 프로그래머 

다른 개발 팀들이 효율적으로 일하는 데 필요한 오프라인 툴들을 만드는 툴 프로그래머

1.1.2 아티스트

컨셉 아티스트 

3D 모델러

텍스처 아티스트

광원 아티스트

애니메이터

모션 캡처 배우

사운드 디자이너

성우

1.1.3 기획자

게임 플레이를 설계한다.

게임 월드의 지형이나 레벨을 다루며, 배경 배치 및 적 출현 위치와 시점 결정, 아이템 배치, 퍼즐 설계 등을 맡는다.

1.1.5 지원부서

스튜디오의 경영 관리 팀

마케팅 팀

IT기술 지원부서

1.1.6 퍼블리셔

게임을 판매, 제조, 배포하는 일은 대부분 개발 스튜디오가 아닌 퍼블리셔를 통한다.

 

1.3 게임 엔진이란

게임 엔진이라는 말은 1990년대에 폭팔적인 인기를 끌었던 아이디소프트의 '둠' 등의 일인칭 시점 슈팅(FPS) 게임에서 유래했다.

 

처음에 엔진은 '모드 제작'을 염두에 두고 설계된 게임들을 위해 존재했다.

 

게임을 만드는데 사용된 소프트웨어가 엔진인지 아닌지를 구분할 때는 소프트웨어가 데이터 주도적으로 설계되었는지를 보는 것이 일반적이다. 게임 규칙이나 어떤 게임 객체를 그리는 부분이 하드코딩돼 있다면 그 소프트웨어는 다른 게임을 만들기 어렵다.

 

일반적으로 게임 엔진이나 미들웨어의 범용성이 커질수록 특정 플랫폼이나 게임에 대한 최적화는 떨어진다.

예를 들면 실내 환경을 전문적으로 처리하게 설계된 렌더링 엔진을 넓은 실외 환경을 다루는데 사용하면 효율적이지 않다.

 

보통 실내용 엔진은 벽 뒤에 있거나 다른 물체에 가려 그릴 필요가 없는 것들을 구분하기 위해 BSP 트리나 포탈 시스템 등을 이용한다. 하지만 실외용 엔진은 물체의 차폐 문제에 깊이 신경 쓰기보다는 적극적으로 LOD을 사용할 가능성이 크다.

 

CPU와 그래픽 카드의 성능이 나날이 향상되고 좀 더 효율적인 알고리즘과 자료구조가 개발됨에 따라 서로 다른 장르를 위한 그래픽 엔진들 간 차이가 줄어들었지만, 범용성과 최적화 간의 균형을 조절하는 것은 게임 개발에서 중요한 문제다.

 

1.4 장르별 게임 엔진

보통 게임 엔진은 특정한 장르의 게임을 위해 만들어진다.

FPS, RTS를 위한 게임 엔진은 서로 차이가 있다.

 

키보드, 마우스, 조이스틱 등 사용자 입력을 처리하는 부분이나 3D 메시를 그리는 부분, 헤드업 디스플레이(HUD) 텍스트 렌더링, 오디오 등은 게임의 장르가 다르더라도 공통적으로 게임 엔진에서 지원해야 할 기능들이다.

 

1.4.1 1인칭 시점 슈터 게임 (FPS : First Person Shooter)

FPS 게임에서 중요시하는 기술

ㄴ 광활한 3D 가상 세계의 효율적인 렌더링

ㄴ 즉각적인 카메라 조작과 조준

ㄴ 매우 사실적인 캐릭터의 팔과 무기 애니메이션

ㄴ 다양한 종류의 소형화기 구현

ㄴ 그럴싸한 캐릭터 움직임과 충돌 구현

ㄴ 매우 사실적인 NPC 애니메이션(플레이어의 적이나 동료 등)과 인공지능

ㄴ 작은 규모의 멀티플레이 지원(보통 64인 이하), '데스 매치'라 불리는 플레이어 간 결투 기능

 

1.4.2 플랫포머와 다른 3인칭 시점 게임

플랫포머에서 중요시하는 기술

ㄴ 움직이는 발판, 사다리, 밧줄, 창살 등의 흥미로운 이동방식

ㄴ 퍼즐이 가득한 배경

ㄴ 메인 캐릭터를 따라 다니며 회전 가능한 3인칭 시점 카메라

ㄴ 시야를 보장하기 위해 시점이 배경이나 물체에 가리거나 뚫고 들어가지 않게 하는 카메라 충돌 시스템

 

1.4.3 격투 게임

ㄴ 풍부한 격투 애니메이션

ㄴ 정확한 타격 감지

ㄴ 버튼과 조이스틱으로 이뤄진 복잡한 입력을 처리할 수 있는 시스템

ㄴ 군중과 대체로 정적인 배경

 

1.4.4 레이싱 게임

ㄴ 먼 곳의 배경을 그리기 위해 다양한 눈속임들(나무나 언덕, 산 등을 빌보드로 그리는 등)을 사용한다.

ㄴ 트랙을 단순한 2차원적인 구획들로 나눠 처리하는 경우가 많은데, 이런 자료구조는 렌더링 최적화나 시야 결정을 비롯해 AI, 길 찾기 등 다양한 기술적 문제를 해결하는데 쓰인다.

ㄴ 카메라는 3차원 시점으로 탈것의 뒤를 쫓아가거나 운전석 안에 위치해 1차원 시점을 제공한다.

ㄴ 터널 등 좁은 트랙을 달릴 때 카메라가 배경과 부딪히거나 뚫지 않도록 한다.

 

1.4.5 실시간 전략 게임 (RTS : Real-Time Strategy)

ㄴ 유닛들은 상대적으로 디테일이 낮아서 한 번에 많은 수의 유닛이 화면에 나와도 문제 없게 한다.

ㄴ 게임을 디자인하고 플레이하는 배경이 되는 지형은 높이 필드를 통해 구현하는 경우가 많다.

ㄴ 병력을 조종하는 기능과 새로운 건물을 지을 수 있는 기능이 있다.

ㄴ 유저 입력은 마우스 클릭이나 드래그를 받고 메뉴와 툴바를 통해 명령, 장비, 유닛 타입, 빌딩 타입 등을 표현한다.

 

1.4.6 대규모 다중 사용자 멀티플레이어 온라인 게임 (MMOG : Massively Multiplayer Online Games)

ㄴ 서버의 역할이 중요

 

1.6 런타임 게임 아키텍처

게임 엔진은 크게 툴과 런타임 구성 요소로 나뉜다. 

게임의 런타임 구성 요소만 해도 엄청 많다..

상위 계층은 하위 계층에 의존하지만 그 반대는 아니다. 게임 엔진 뿐만 아니라 다른 어느 소프트웨어라도 하위 계층이 상위 계층에 의존하게 되면 시스템 간 불필요한 결합을 생기게 하기 때문에 주의해야 한다.

 

1.6.1 Hardware 계층

ㄴ 게임이 동작할 컴퓨터나 콘솔 시스템을 뜻한다.

 

1.6.2 Drivers 계층

ㄴ 디바이스 드라이버는 운영체제나 하드웨어 제조사에서 제공하는 로우레벨 소프트웨어이다.

 

1.6.3 OS 계층

ㄴ 대부분의 최신 OS(윈도우, 플레이스테이션 3, 엑스박스 360) 에서는 여러 애플리케이션 간 하드웨어 자원을 분배할 때 선점형 멀티태스킹으로 알려진 시분할 기법을 사용한다.

 

1.6.4 써드파티 SDK와 미들웨어 계층

대부분 게임 엔진은 다양한 서드파티 소프트웨어 개발 도구(SDK)와 미들웨어를 적극 이용한다.

 

1.6.4.1 자료구조와 알고리즘을 제공하는 라이브러리

ㄴ STL : C++ 표준 템플릿 라이브러리는 여러 가지 자료 구조, 문자열, I/O 스트림에 관한 코드와 알고리즘을 제공한다.

ㄴ STL port : 여러 플랫폼에서 사용 가능한 좀 더 최적화된 STL

ㄴ Boost : STL 스타일로 설계된 강력한 자료 구조와 알고리즘 라이브러리

ㄴ Loki : 강력한 제네릭 프로그래밍 템플릿 라이브러리

 

어떤 라이브러리를 사용할지 결정하는 데 있어서 PC 환경인지 콘솔 환경인지가 중요한 요소가 된다. 예를 들어 콘솔 환경은 PC 환경과 달리 캐시 미스 문제가 치명적인데, 어떤 자료구조를 사용하느냐에 따라 캐시 미스 발생률에 차이가 있을 수 있다.

 

1.6.4.2 그래픽스

게임 렌더링 엔진은 다음과 같은 하드웨어 인터페이스 라이브러리를 사용하여 구현한다.

ㄴ OpenGL

ㄴ DirectX

 

1.6.4.3 충돌과 물리

ㄴ Havok : 인기 있는 고성능 물리, 충돌 엔진

ㄴ PhysX : 엔비디아에서 만든 물리, 충돌 엔진

ㄴ Open Dynamics Engine : 오픈소스 물리, 충돌 패키지

 

1.6.4.4 캐릭터 애니메이션

1.6.4.5 인공지능

1.6.4.6 생체 역학적 캐릭터 모델

 

1.6.5 플랫폼 독립적 계층

대부분 게임 엔진은 적어도 한 개 이상의 하드웨어 플랫폼에서 동작해야 하기 때문에 (더 넓은 시장을 확보하기 위해)

함수가 여러 플랫폼에서 일관성 있게 동작할 수 있게 하는 계층이다. 

ㄴ 파일 시스템

ㄴ TCP/UDP

ㄴ 스레드 라이브러리

 

1.6.6 코어 시스템

게임 엔진을 비롯해 규모가 큰 모든 C++ 소프트웨어에서 사용할 수 있는 유틸리티

ㄴ assertion : assert 단정문을 사용하여 전제 조건을 점검한다. 최종 버전에서는 보통 제거한다.

ㄴ 메모리 관리 시스템 : 메모리 할당과 해제의 효율성, 메모리 단편화 방지를 위해 전용 메모리 시스템을 구현한다.

ㄴ 수학 라이브러리 : 게임 엔진은 수리 연산을 많이 사용하기 때문에 필요하다.

 

1.6.7 자원 관리자

게임 엔진의 모든 자원과 엔진 데이터에 접근하기 위해서는 자원 관리자를 거쳐야 한다.

자원의 종류 (게임 Assets)

ㄴ 게임 월드

ㄴ 3D model

ㄴ 텍스처

ㄴ 폰트

등..

 

1.6.8 렌더링 엔진

널리 알려진 효율적인 렌더링 엔진은 계층적인 구조로 디자인되어 있다.

 

1.6.8.1 로우레벨 렌더러

1. 그래픽 디바이스 인터페이스

ㄴ 다이렉트X나 OpenGL같은 그래픽 SDK를 사용할 때 그래픽 하드웨어를 찾아내고 초기화하고 후면버퍼, 스텐실 버퍼를 설정하는 부분을 뜻한다.

ㄴ PC용 게임 엔진을 만들 때는 윈도우 메세지가 도착하면 처리를 하고 나머지 시간에 렌더러의 루프를 돌리는 방법을 쓴다. 이 방법의 단점은 키보드 메세지를 처리하는 루프와 스크린을 업데이트하는 렌더러의 루프 사이에 의존성이 생긴다는 것이다.

 

2. 기타 렌더러 구성 요소

카메라 월드 행렬, FOV, 근평면 원평면, material, 

 

1.6.8.2 장면 그래프와 추려내기 최적화

게임 월드가 작다면 단순한 절두체 cull로 충분하지만 큰 게임 월드에서는 고급 공간 분할 방식을 사용한다.

보일 가능성이 있는 집합(PVS : potentially visible set)을 빨리 찾아내 렌더링 성능을 향상시키기 위해서다. 

공간 분할은 이진 공간 분할 트리(BSP),  옥트리(octree), kd 트리, 구형 계층 등을 사용할 수 있다.

 

로우레벨 렌더러는 사용된 공간 분할 방식이나 장면 그래프 종류에 전혀 영향을 받지 않는 것이 가장 이상적이다.

 

1.6.8.3 시각 효과

ㄴ 파티클 시스템

ㄴ 데칼 시스템

ㄴ 조명 매핑, 환경 매핑

ㄴ 동적 그림자

ㄴ 풀 스크린 후처리 효과

 

1.6.8.4 Front End

대부분의 게임은 3D 그래픽 외에 그 위에 덧씌워지는 2D 그래픽을 사용한다.

2D 화면들은 텍스처를 입힌 사각형을 직교 투영해 그리기도 하고, 3D 빌보드에 그린 후 항상 카메라를 향하게 구현하기도 한다.

ㄴ 게임의 HUD

ㄴ 게임 메뉴, 콘솔, 기타 개발 툴, GUI

 

인게임 시네마틱 : 장면을 순차적으로 재생시킬 수 있는 시스템

FMV 시스템 : 미리 녹화된 풀 스크린 비디오를 재생하는 시스템

 

1.6.9 프로파일링과 디버깅 툴

실시간 시스템인 특성 때문에 게임은 항상 최적화를 위해 프로파일링을 해야 한다. 또 메모리가 항상 부족하기 때문에 메모리 분석 툴도 함께 사용해야 한다.

대부분의 게임 엔진을 자체적으로 프로파일링과 디버깅 툴을 구현한다.

이런 툴들에 들어갈 만한 기능들

ㄴ 코드를 실행 시간을 측정하는 기능

ㄴ 게임 화면에서 실시간으로 프로파일링 수치를 보여주는 기능

ㄴ 게임 엔진과 각 하부 시스템이 사용 중인 메모리의 양을 측정하는 기능

ㄴ 디버그 메세지를 코드 어느 곳에서나 출력할 수 있고 필요한 항목마다 켜고 끄는 기능

ㄴ 게임 플레이를 녹화하고 재현하는 기능

 

1.6.10 충돌과 물리

보통 직접 물리 엔진을 만들기 보다는 Havok, PhysX, 오픈소스 엔진 중 선택하여 사용한다.

 

1.6.11 애니메이션

애니메이션의 종류

ㄴ 스트라이프 / 텍스처 애니메이션

ㄴ 강체 계층 애니메이션

ㄴ 뼈대 애니메이션 (오늘날 가장 널리 쓰이는 방식)

ㄴ 정점 애니메이션

ㄴ 모프 타겟

 

1.6.12 휴먼 인터페이스 장치

ㄴ 키보드 마우스 조이패드

ㄴ 동치, 연타, 제스처를 감지하는 시스템을 구현하는 경우가 있다.

ㄴ 플랫폼마다 다른 하드웨어 정보를 상위 게임 컨트롤에서 분리시키는 것이 고려 사항인 경우도 있다.

 

1.6.13 오디오

퀘이크나 언리얼 엔진의 오디오 툴

PC나 엑스박스 360용 다이렉트X의 XACT 오디오 툴

 

1.6.14 온라인 멀티플레이어와 네트워킹

멀티플레이어 게임의 분류

1. 단일 스크린 멀티플레이어 - 여러개의 인터페이스 장치가 하나의 게임기에 연결, 하나의 화면

2. 분할 화면 멀티플레이어 - 여러개의 인터페이스 장치가 하나의 게임기에 연결, 플레이어마다 화면이 존재

3. 네트워크 멀티플레이어 - 여러 대의 컴퓨터나 게임기가 네트워크를 통해 연결돼 있는데, 각 기계는 한 명의 플레이어가 사용

4. 대규모 다중 사용자 게임 - 여러 대의 서버가 필요함

 

1.6.15 게임플레이 기반 시스템

게임 내에서 하는 행동, 게임 세계의 규칙, 플레이어 캐릭터들의 능력 등을 구현하는 계층

게임 플레이 계층과 로우 레벨 계층들 사이 매개하는 계층

 

1.6.15.1 게임 월드와 객체 모델

게임 월드안에는 여러가지 가변적인 요소와 그렇지 않은 요소들이 포함돼 있다.

게임 월드에 속하는 여러 구성물들을 객체지향적인 방법을 모델화한다.

게임 객체의 예

ㄴ 배경, 빌딩, 길, 지형

ㄴ 동적인 단단한 물체들, 바위, 음료수 캔, 의자

ㄴ 플레이어 캐릭터

ㄴ NPC

ㄴ 무기

ㄴ 탈것

ㄴ 빛

ㄴ 카메라

 

1.6.15.2 이벤트 시스템

게임 안의 객체들이 서로 소통하기 위해 필요하다.

 

1.6.15.3 스크립트 시스템

게임 규칙과 콘텐츠를 쉽고 빠르게 변경하기 위해 컴파일을 다시 하지 않고 게임을 수정하기 위해 스크립트 언어를 사용한다.

 

1.6.15.4 인공지능 기반 시스템

ㄴ AI 캐릭터가 지형지물과 충돌하지 않고 이동할 수 있도록 이동 가능한 지역을 경로 노드에 연결하는 기능

ㄴ A* 알고리즘을 기반으로 한 길 찾기 엔진 

 

1.6.16 게임 특화 하부 시스템 (게임 플레이 계층)

게임플레이 시스템은 수가 많고 종류가 다양할 뿐만 아니라 어떤 게임을 개발하느냐에 따라 특화된 모습을 보인다.

 

1.7 툴과 자원 파이프라인

1.7.1 디지털 콘텐츠 생성 도구 (Digital Content Creation)

ㄴ 마야, 3ds 맥스 : 3D메시와 애니메이션 데이터를 생성

ㄴ SoundForge : 오디오 클립을 생성

ㄴ 포토샵 : 텍스처 생성

ㄴ 월드 제작 툴 : 자체 제작

 

1.7.2 자원 다듬기 파이프라인

DCC에서 만든 데이터(자원)를 바로 게임 엔진에서 사용할 수는 없다. 

1. DCC의 자원 메모리 모델은 게임 엔진에서 그대로 쓰기에는 필요 이상으로 복잡하기 때문

2. DCC 프로그램의 데이터 파일 형식은 읽어 들이는데 시간이 너무 많이 걸리고 저작권이 걸린 경우도 있다.

ㄴ 접근성이 뛰어난 표준 포맷이나 다른 형태로 export 해야 한다.

 

1.7.8 툴 구조에 대한 접근 방식

게임 엔진에서 툴은 독자적 소프트웨어인 경우도 있고, 엔진과 일정한 하위 계층을 공유하기도 하며, 어떤 경우는 아예 게임 안에 포함되는 경우 (실행 커맨드 옵션만 바꿔서 게임과 에디터를 왔다 갔다)도 있다.

+ Recent posts