소년코딩

게임 프로그래머가 되는 방법 (클라이언트)


game

게임 프로그래머는 크게 클라이언트 프로그래머와 서버 프로그래머로 나뉜다. 나는 클라이언트 프로그래머를 지망하는 학생이므로 클라이언트를 먼저 알아보겠다.

클라이언트 프로그래머는 사용자의 입력을 받아 게임 로직을 실행시키고 화면에 무언가를 그리거나 사운드를 출력해주는 업무를 담당하는 프로그래머다 -디스이즈게임-

이 포스트는 클라이언트 프로그래머가 되기 위해 어떤 과정을 밟는지와 가장 기본적으로 어떤 것들을 공부해야 하는지에 대해서 차례차례 알아본다.

나는 현재 학생 신분이므로 모든 것을 알지는 못한다. 그러나 지난 몇해동안 클라이언트 프로그래머가 되기 위한 과정을 밟아왔다. 그 과정에서 참고한 여러 문서와 내 개인적인 견해를 더해 정리를 해보려 한다.


게임 프로그래머가 되기 위해서는 대학 진학을 하는 방법과 대학 진학을 하지 않는 방법이 있다.

1. 대학 진학을 하는 경우

컴퓨터 공학과

대부분의 국내 대학에는 컴퓨터 00, 소프트웨어학과 같은 이름으로 불리는 컴퓨터 공학을 공부하는 학과가 개설되어있다. 그러나 대부분 컴퓨터 공학과의 커리큘럼은 임베디드, 모바일, 보안, 웹서비스 등을 포함한 여러 프로그래밍 과목을 두루두루 배우므로 실상 게임 프로그래밍의 기법이나 노하우 같은 건 거의 배우지 못할 수도 있다. 그러므로 동기 친구들과의 스터디, 학원, 독학 등 학교의 정기 커리큘럼 이외의 방법을 모색해서도 실력을 쌓아야 한다.

게임 공학과

국내의 게임학과들은 10년이 넘은 과가 거의 없을 정도로 역사가 짧고, 커리큘럼 역시 제대로 정립되어 있지 않다. 게다가 대학 특유의 비효율적인 교육과정 때문에 실력만 따지자면 2-4년제 게임학과 졸업생보다 오히려 현업 출신 강사에게 알짜배기 교육만 받는 학원 출신이 더 잘하는 경우가 많다. -나무위키-

그러나 모든 게임 공학과가 나무위키에서 말한 저 위 내용 같지는 않다. 학교 홍보는 아니지만, 실제 현재 본인이 재학 중인 산기대 게임공학과는 현업 출신 교수님들과 함께 깊이 있는 커리큘럼을 진행 중이다.

2. 대학 진학을 희망하지 않는 경우

독학

스승 또는 학교의 도움을 받지 않고 혼자서 공부하는 것을 말한다. 주로 책이나 웹 사이트, 온라인 강좌 등 다양한 지식창고들을 직접 찾아 나아가면서 학습한다. 정보를 수집하다 보면 찾고 있던 정보가 국어가 아닐 경우, 또 해석본이나 번역본을 찾기 힘들 경우에는 스스로 해석을 해야 하는 어려움이 따른다. 또한, 그 정보가 반드시 옳다라는 보장도 없다.

학원

독학하는 것은 매우 힘들다. 따라서 게임 학원에 다니는 것이 좋은 방안이고, 국비 지원 하는 학원이 많다. 그러나 학원 중에는 요즘 유행하는 유니티 게임 엔진만 교육하는 학원이 많다. 이런 학원은 수준 향상에 도움이 안될뿐더러 회사는 유니티만 다룰 수 있는 사람은 선호하지 않는다. 그러므로 비용이 많이 들더라도 커리큘럼이 체계적으로 잘 정립된 학원을 선택해 기초부터 공부하는 것을 추천한다.


게임 프로그래머가 되기 위해선 어떤 것을 준비해야 할까? 박종천 부본부장은 먼저 당장 쓸 수 있는 '스킬'보다, 그 기저에 깔린 '기초지식'에 집중하라고 조언한다. 기초가 튼튼하면 된다. 수학, 물리학 같은 기초 학문은 물론, CPU 구조는 어떤 방식인지, 윈도우는 메모리를 어떻게 할당하는지, 각 언어는 어떤 특징을 가지고 있는지 등등 -2016 NDC-

위에서 말한 기초지식은 대부분의 대학교 컴퓨터 공학과의 커리큘럼에서 학습할 수 있다. 그러나 학원에 다니는 경우 상대적으로 짧은 시간 내에 엑기스를 주입하는 교육 특성상 미처 학습하지 못하고 지나갈 수 있으므로 주의 깊게 공부해야 한다.

study


 

공통으로 무엇을 배워야 할까?

프로그래밍 언어

프로그래밍 언어는 무엇이 되든 상관이 없다. 본인이 생각하고 있는 것을 로직으로 작성할 수 있고, 그 결과를 알아볼 수 있기만 하다면 말이다.

그러나 만일 한 가지 언어를 선택하는 것이 어렵다면 C++를 추천하고 싶다. 자바나 C#과 같은 언어들도 좋지만, 이 글을 쓰고 있는 시점에서 여전히 게임 개발의 주류 언어는 C++다.

기본적으로 C 계열 언어를 잘 알고 있다면 거의 모든 플랫폼에서 게임을 개발하는 데 어려움은 없을 것이다.

※ NOTE. 현재 모바일 게임 시장이 크다. PC에서는 C++ 이 강세이지만, 모바일에서는 유니티 엔진으로 게임을 개발하는 회사가 많다. 이를 위해서는 C#을 공부하는 것도 좋은 선택이다.

컴퓨터 구조

프로그래머는 컴퓨터 소프트웨어를 만드는 사람이다. 그래서 컴퓨터라는 물건이 어떻게 동작하는지 내부적으로 알아야 한다. 물론 내부적으로 어떻게 컴퓨터가 동작하는지 몰라도 소프트웨어를 작성하는 데 무리는 없다.

하지만 컴퓨터의 동작 원리를 알고 나면 컴퓨터 소프트웨어를 작성하는 데 많은 도움이 되는 것은 사실이다. 그리고 콘솔 게임 개발자라면 해당 게임기(예를 들어 PS3, Xbox360)의 하드웨어에 대한 이해가 필수다. 하드웨어에 대한 올바른 이해를 갖추고 있어야 해당 게임기의 최고 성능을 이끌어낼 수 있기 때문이다.

수학

고등학교 수학 수준으로는 요새 출시되는 게임들을 만들 수 없다. 대수학, 삼각함수, 미적분, 선형 대수학 정도는 알아 두어야 게임을 만들 때 막힘이 없을 것이다.

자료구조 / 알고리즘

자료구조와 알고리즘은 프로그래머에게 필수다. 데이터를 어떻게 표현하는가에 따라 프로그램의 성능이 좌우되는 경우가 많다. 예를 들어 컴퓨터는 캐시 메모리가 있고 이 캐시 메모리를 잘 사용한 자료구조는 성능을 대폭 향상시킨다. 또한 프로그래머에게 있어 가장 중요한 것은 논리적인 사고를 이용한 문제 해결 능력이다.

라이브러리 / API

모든 라이브러리나 API 사용법을 알 필요는 없다. 하지만 최소한 본인이 만들어낼 프로그램이 돌아가는 기계의 종류를 알고 거기에 필요한 API나 라이브러리들이 어떠한 것들이 있는지는 알아 두어야 한다.

컴퓨터 그래픽스

게임은 모니터에 무언가를 그려야 하므로 DirectX, OpenGL 둘 중에 하나는 알아야 한다. 이러한 라이브러리를 사용하는 것뿐만 아니라 원리를 알기 위해서는 컴퓨터 그래픽스라는 것을 공부해야 한다. 내부적인 모든 원리를 알면 좋겠지만 어렵다면 최소한 개론 서적 정도는 읽어 주자. 내부 원리를 알고 라이브러리를 사용하는 것과 모른 채로 사용하는 것은 많은 차이가 있다.


다음은 게임 학원의 정규 커리큘럼과 게임 공학과 커리큘럼을 통해 클라이언트 프로그래머가 되기 위한 실질적인 공부 순서를 알아보겠다. 아래 추천하는 책과 링크는 지극히 주관적이다. 각 단계별로 학습을 하는 데 있어 정해진 순서는 없다. 모두가 톱니바퀴처럼 맞물려서 상호작용한다.

Roadmap

1. Learn the Basics

C / C++

프로그래밍 언어는 로직을 표현하는 데 있어 일종의 도구다. 이 도구를 잘 활용하기 위해 문법 숙지는 필수다. 문법 숙지가 됐다면 테트리스, 스네이크 게임 등 텍스트 기반 소규모 프로젝트를 통해 활용 능력을 키우는 게 좋다.

자료구조 / 알고리즘

자료구조란 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법이다. 신중히 선택한 자료구조는 더 효율적인 알고리즘을 사용할 수 있게 한다. 각 게임에 맞게 자료를 구성하는 시스템을 만드는 일도 자료구조의 일종이다. 마찬가지로 게임에 맞는 로직을 구현하는 것도 알고리즘의 일종이다.

게임 기초 수학 / 물리

행렬, 벡터, 삼각함수, 가속도, 중력, 충돌처리 등 게임을 개발하는 데 있어 기초 수학 / 물리를 습득한다.

네트워크

클라이언트 프로그래머도 어느 정도의 서버 지식을 갖추어야 한다. 소켓프로그래밍의 기초를 습득해 방 입장 채팅 / 구현 수준의 능력을 갖춘다.

컴퓨터 / 시스템 구조

컴퓨터의 동작 원리를 알고 나면 컴퓨터 소프트웨어를 작성하는 데 많은 도움이 된다.

윈도우 API(or MFC)

윈도우 API를 사용해 윈도우 응용 프로그램을 만들 수 있다. 더는 텍스트 기반이 아닌 그래픽 기반의 2D 게임을 만들 준비가 완료된 것이다.


2. Game Technique

2D Game Programming

여기까지 학습하고 간단한 2D 게임을 뚝딱 만들 수 있으면 좋겠지만, 현실은 어떻게 접근해야 할지 막막하다.

게임 프로그래밍은 게임에 쓰이는 여러 가지 기법을 경험해 볼 필요가 있다. 아래 책들은 Windows API 플랫폼으로 작성되어 있지는 않지만 2D 게임이므로 렌더링 API를 제외하면 그 본질은 같다. 2D 게임 기법은 좀 더 응용되어 3D 게임 프로그래밍에서도 쓰인다.

Box2D

박스2D(Box2D)는 에린(Erin Catto)에 의해 C++로 작성된 자유 오픈 소스 2차원 물리 시뮬레이터 엔진의 하나다. 일명 물리 엔진이다. 물리 효과는 게임의 오브젝트, 즉 가상 세계의 물체 간의 상호작용에 좀 더 현실감을 준다. 자신의 2D 게임에 Box2D 라이브러리를 사용해 보는 것은 큰 공부와 즐거움이 된다.

다음은 Box2D와 관련된 유명한 일화다.

Erin: “Hi Peter, could you tell me which physics engine Angy Birds uses?”
Peter: “Box2D”
Erin: “Great. Would you consider giving credit to Box2D in your game?”
Peter: “Yes, of course”
Erin: “Thank you! By the way, I am Erin Catto the creator of Box2D”
Peter: “Great! I would like to talk to you after the session”
 

3. Getting Deeper

STL

STL은 컨테이너(Container, 자료구조) / 반복자 / 알고리즘 간의 협력에 기반을 둔 C++ 표준 템플릿 라이브러리다. 사실 현업에 있어 스택과 같은 자료구조를 직접 개발 하지는 않는다. 대게 표준을 쓴다.

디자인패턴

디자인패턴이란 프로그래밍을 하는 데 있어 특별한 상황에 이렇게 하는 게 좋더라 라고 패턴화된 내용이다. 즉, 어떤 상황의 문제에 대한 해법이다.

그래픽스 API

쉽게 말해서 DirectX다. DirectX의 API를 사용해 GPU 프로그래밍이 가능하다. 이것을 통해 실질적인 3D 게임 프로그래밍이 가능하다.

3D 공간에 대한 이해 / 선형대수학

행렬, 벡터 등 수학은 계속해서 필요하다. 가상세계에서 3D 물체가 어떻게 표현되는지에 대한 이해가 필요하다. 물체의 위치는 행렬 연산에 의해 표현되므로 선형대수학 지식또한 필요하다.

렌더링 파이프라인 / 셰이더

렌더링 파이프라인이란 가상 카메라에 비친 3차원 장면의 모습에 근거해서 2차원 이미지를 생성하는 데 필요한 인련의 단계들 전체를 뜻한다. 여기서 정점 셰이더 단계, 픽셀 셰이더 단계 등 셰이더 프로그래밍이 가능하다.

물리 라이브러리

PhysX, Bullet 등과 같은 3D 물리 라이브러리를 사용해보는 것도 많은 공부가 된다. 상용 엔진의 물리 시스템을 이용하는 데 큰 도움이 될것이다.(유니티, 언리얼 모두 PhysX를 사용한다.)

게임 시스템

  • 게임 루프
  • 입력 처리
  • 충돌 처리
  • AI
  • 렌더링...

등 포괄적인 것을 말한다. 간단하게나마 게임 프레임워크를 만들어 보는 것은 훌륭한 공부가 된다.


위에 까지가 게임 프로그래머(클라이언트)가 될 수 있는 최소 역량이라 생각한다. 그러나 위에 나열한 공부를 하면 더 할수록 더 공부할게 많이 보이는 법이다. "무엇을 모르는지 알기 위해 공부한다." 이런 생각이다. 더 많이 정리된 로드맵이 있으니 참고 바란다. https://github.com/utilForever/game-developer-roadmap


다음으로는 유니티, 얼리얼과 같은 상용 게임엔진을 학습한다.

게임 엔진은 비디오 게임 같은 실시간 그래픽 표시 기능을 갖춘 상호 작용 응용 프로그램을 구현하는 핵심 소프트웨어 구성 요소를 말한다. 컴퓨터 게임 개발에 바탕이 되는 기술을 제공하여 개발 과정을 단축시켜 줄 뿐 아니라, 게임을 다양한 플랫폼에서 실행할 수 있게 해주기도 한다. 특히 게임 엔진은 재사용을 염두에 두고 있기 때문에, 하나의 게임에 종속되지 않고 여러 종류의 게임에 쓰일 수 있도록 개발된다. 게임 엔진이 제공하는 주요 기능으로는 2차원 그래픽이나 3차원 그래픽을 출력하기 위한 렌더링 엔진, 물리 엔진, 충돌 검출과 충돌 반응, 사운드 출력, 스크립트 작성, 애니메이션, 인공 지능, 네트워크, 스트리밍, 메모리 관리, 쓰레딩, 씬 그래프 등이 있다. -나무위키-

즉, 유니티와 언리얼과 같은 상용 게임엔진은 게임을 쉽게 개발할 수 있는 일종의 도구다. 학습 장벽이 높다는 이유로 기초지식을 수박 겉핥기 식으로 학습하고, 진입 장벽이 낮다는 이유로 유니티만 할 줄 아는 프로그래머는 스크립터다. 이러한 프로그래머는 실력이 안 되니 조금만 난이도가 올라가도 재대로 빌드를 하지 못하거나 최적화에 실패하고 자기가 만든 시스템이 디버깅이 안되는 등 문제해결능력이 극히 떨어지는 스크립터가 된다.


참고 문서

  • http://www.thisisgame.com/webzine/nboard/212/?n=52375
  • http://www.thisisgame.com/webzine/news/nboard/4/?n=61846
  • https://namu.wiki/w/게임%20프로그래머

2018/07/01 - [겜공 이야기] - 한국산업기술대학교 게임공학과: 산기대 겜공 소개

2018/01/27 - [겜공 이야기] - 컴퓨터 그래픽스와 OpenGL 그리고 학기 프로젝트

2018/01/10 - [겜공 이야기] - [2017년 회고] 게임공학과 학생 이야기와 블로그 결산

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기