정말초짜게임개발입문자를위한FAQ
RenameThisPage
페이지 이름을 바꾸었으면 좋겠습니다. 좀 더 공식적인 이름으로 제안해주세요 --WkPark
1. 게임 프로그래머를 주위에서 시작하는 사람이 많습니다. 뭐, 한번 해볼려고 하는데 어떤 분야인가요? ¶바야흐로 컴퓨터 게임은 TV나 신문에서 뿐만 아니라 이제는 모르는 사람이 없을 정도로 사회에서는 하나의 문화가 되었습니다. 어떤 것을 가지고 논다는 행위는 컴퓨터가 있기 전에서도 물론 존재했었지만, 컴퓨터라는 기계의 다양한 용도는 그만큼 다양한 장르의 게임을 양산하는 원동력이 되었던 것이 사실입니다. 이제는 TV에서 게임 플레이를 실시간으로 중계해 줄 정도로 인기가 올라갔지만, 컴퓨터 게임의 그 의미는 옛날이나 지금이나 거의 같습니다. (요즘의 포트리스2 같은 게임을 보면 옛날 게임으로 돌아가는 것이 아닌가 하는 생각마저 듭니다.)
하지만, 게임을 하는 것과는 달리 프로그래머의 입장에서 게임 프로그래밍이라는 부분은 그리 만만한 분야가 아닙니다. 단순한 하나의 게임을 만드는데 있어서 상당한 량의 지식과 두뇌노동을 요구합니다. 그 이유는 웹 프로그래밍, 시스템 프로그래밍과 같이 단지 하나, 혹은 두가지정도의 분야에만 성능개선 및 구현을 생각하는 것이 아니라 거의 모든 프로그래밍 분야를 섭렵하면서 가장 빠르면서 가장 보기좋은 것을 만들어내야하기 때문에 그 난이도는 상당히 높은 분야라고 할 수 있습니다. 국내, 해외에서도 게임개발에 대한 인식이 굳어져있는 까닭에 이제는 개발하는데 있어서 필요한 부분이 다소 정리되어있는 것은 그나마 다행이라고 할 수 있습니다.
현재는 전문화가 많이 이루어져 2D/3D, 네트워크등등 각 분야별로 나누어 인력을 모집하는 추세입니다. 그렇다 하더라도 각각의 분야에 대한 공부는 약간이라도 해두는 것이 좋습니다. 현재는 게임개발에 대한 서적이나 학원이 많이 생겨있으므로 여러군데를 알아보는 것도 좋을 것 같습니다.
2. 개발자 입장에서의 게임의 구성요소는 어떻게 되나요? ¶우선 실제로 게임을 플레이하는 것과 만드는 것과는 많은 차이가 있습니다. 특히 이런 점은 프로그래머외에 다른 분야의 사람들과 많은 이견을 나타내기도 합니다. 보통 기획자는 프로그램의 재미와 특징을 보다 많이 넣기를 프로그래머에게 요청하며, 그래픽 디자이너는 보다 편한 방법으로 게임에 쓰일 데이타를 넘겨주길 원합니다. 그런 것들은 프로그래머에게는 의무이자 부담으로 다가오게 되죠. 보통 게임을 제작하게 되면 팀을 이루어서 일하게 되는데 이때 필요한 게임을 제작하기 위한 분야의 인력은 보통 크게 3가지로 나누어지며, 각 분야의 역할은 다음과 같습니다.
3. 그렇군요. 공부해야하는 분야는 그럼 어떤 것이 있나요? ¶아래는 게임 프로그래밍을 시작하기 위해서 일반적으로 공부하게 되는 것들을 나열한 것 입니다. 물론 간혹 특이하게 개발하시는 분들도 계시지만 대부분의 프로그래머들이 겪게되는 단계라고 생각하시면 되겠습니다.
3.1. 프로그래밍 언어 ¶
3.2. Microsoft Windows Platform SDK (Win32 SDK) ¶Microsoft에서는 윈도우즈 프로그래밍을 위해서 C 전용 함수(하나의 기능을 수행하기위한 명령어들의 모음. C 문법 중 하나입니다.)들의 분야별 모음을 제공하고 있습니다. (이것을 흔히 라이브러리라고 합니다.) 공부하기에 상당히 방대한 양을 자랑하고 여러 분야로 나뉘어 있어 윈도우즈 프로그래밍을 시작하는 사람들의 가장 큰 난관이 되고 있는 부분이기도 합니다.
3.3. 자료구조 및 알고리즘 ¶어느정도 언어에 익숙해지면 내부적인 데이터 관리가 상당히 중요해집니다. 이런 데이타 관리방법에 대한 이론을 보통 자료구조''라고 지칭하는데 게임 프로그래밍 성격상 어느정도 계속 학습을 해주어야 하는 분야이기도 합니다. STL과 같은 C++ 표준라이브러리를 보시면 도움이 많이 될 것 입니다. 알고리즘'''이라고 하는 것은 어떠한 기능이나 효과를 구현하기 위한 일련의 단계나 방법을 정형적으로 설명한 것이라고 생각하시면 됩니다. 간단히 말하면, 어떤 것을 구현하는데 괜찮은 방법이 하나 있다라고 말하는 것을 어떤 것을 구현하는 알고리즘을 제시한다라고 하죠.
3.4. 2D 게임개발 라이브러리 ¶흔히 우리가 접하기 쉬운 2D 게임을 제작할 수 있도록 도와주는 라이브러리들입니다. 상업적인 게임프로그램 제품을 만들기 위해서는 어느정도 고성능을 내기 위한 특수한 기능의 함수들을 사용해야하는데, 주로 화면 출력을 담당하는 경우가 많습니다. 다음은 그 종류 입니다.
3.4.1. DirectX 7.1 - DirectDraw ¶Microsoft사에서 제공하는 게임전용 화면출력 라이브러리를 말합니다. 상당히 빠른 속도를 자랑하지만 상당히 화면출력 하드웨어 구조에 대해 어느정도의 이해가 있어야하고 함수들의 사용법이 난해한 것이 단점입니다. 오늘날 가장 많이 사용되는 라이브러리라고 할 수 있습니다.
3.4.2. GDI ¶위에서 언급한 Win32 SDK의 한 부분으로 화면출력만을 담당하는 부분을 말합니다. DirectDraw보다는 느리지만 게임 이외의 분야에도 보편적으로 사용되며 사용하기 비교적 쉽다는 것이 장점입니다.
3.4.3. SDL ¶Loki Software라고 하는 회사에서 만든 Linux용 게임 라이브러리입니다만, 윈도우즈에서도 사용할 수 있습니다. 한번의 코딩으로 여러 운영체계용 게임을 동시에 만들수 있다는 것이 장점이지만 디버깅이 어렵고 한글지원이 안되는 등 여러가지 단점때문에 아직은 발전단계에 있는 라이브러리라고 할 수 있습니다.
3.5. 3D 게임개발 라이브러리 ¶현재 게임개발에서 이슈가 되고 있는 3D 게임을 개발하기 위한 기초 라이브러리들입니다. 수학적인 바탕까지도 요구하는 상당한 난이도를 필요로 하는 분야라고 볼 수 있습니다. 다음은 게임업계에서 가장 많이 사용되는 라이브러리들입니다. 보통 아래 나열한 두 개중 하나의 라이브러리위에 엔진이라고 하는 좀더 고급 라이브러리를 제작하여 사용하는 것이 보통입니다.
3.5.1. DirectX 8 - DirectGraphics ¶Microsoft사에서 제공하는 게임전용 3D 라이브러리를 말합니다. (앞서말한 DirectDraw를 포함하고 있으며 버전 8부터 명칭이 바뀌었습니다.) 윈도우즈용 3D 게임프로그램을 작성하시게 된다면 꼭 고려해보셔야하는 라이브러리 중 하나입니다. 단점이라면 M$의 지원하에 이루어지는 라이브러리이고 공개가 아닌 까닭에 신규 기술에 대한 내용을 제시하는 웹상의 자료에서나 서적에서는 많이 언급하지 않는 편입니다. 많이 라이브러리의 성능이 좋아진 까닭에 현재는 Directx를 주제로한 서적도 많이 출간되는 상황입니다.
3.5.2. OpenGL ¶SGI(실리콘 그래픽스)에서 창안하여 전세계 3D 프로그래밍 표준으로 자리잡고 있는 라이브러리입니다. ID Software의 퀘이크라는 게임이 이 라이브러리를 기반으로 사용하여 제작한 후 전세계적으로 큰 인기를 누리면서 같이 유명해진 라이브러리라고 볼 수 있습니다. 여러 운영체계를 지원하므로 리눅스, 윈도우즈, 매킨토시등 어디서나 사용할 수 있는 장점이 있는 반면, 윈도우즈상에서는 DirectGraphics보다 약간 성능이 떨어지는 것으로 알려져 있습니다. 국내외 웹에서 상당한 자료를 찾을 수 있으며 (원서지만) 많은 서적이 출간되어있습니다. 거의 대부분의 3D 이론이나 알고리즘은 이 라이브러리로 설명하는 편입니다.
3.6.1. DirectPlay ¶Microsoft에서 제공하는 게임서버및 클라이언트 제작용 라이브러리 입니다. 비교적 쓰기 쉽다는 것이 장점이며 버전 8이 되면서 많이 안정화가 되었습니다. 대규모 개발에는 어울리지 않으며, P2P 기반의 게임에는 쓸만하다는 평가가 있습니다.
3.6.2. Winsock2 - socket ¶게임서버 뿐만이 아니라 네트워크 프로그래밍 전분야에 걸쳐서 일반적으로 사용되는 라이브러리이지만 네트워크에 대한 많은 지식을 요구하며, 기반적인 코드만이 존재하는 것이 단점입니다. 다시 말하면, 상당히 저레벨 함수들만 있어 대부분의 기능은 손수 개발해야 합니다.
3.6.3. ACE(Adaptive Communication Environment) ¶개인적으로 제가 사용하는 C++ 기반의 네트워크 라이브러리입니다. 미국의 대학 연구실에서 몇 년에 걸쳐서 개발한 오픈소스 라이브러리이며, 상당히 고성능의 서버 구조를 제공합니다. 배우기 어렵고 자료가 거의 없는 것이 단점이지만, socket 라이브러리를 사용해서 개발할 때 생길수 있는 시행착오에 대한 요소들을 많이 보정한 것이 장점이며, 패턴과 연구논문들에 기반한 상당히 고성능의 서버형식을 지원합니다.
5. 소스코드가 뭐죠? ¶소스코드는 프로그래머가 작성하는 산출물을 의미합니다. 다음과 같은 것을을 말하죠:
highscore[game]++;
printf("%d\n",highscore[game]); 이 소스 코드 현재 게임의 하이스코어를 1 증가시키고 그 내용을 출력하는 내용입니다. 프로그래머는 많은 량의 소스코드를 작성합니다. 1만 라인의 소스코드를 작성하는 것 정도는 그렇게 특이할 만한 일이 아닙니다. 좀더 세련된 게임은 훨씬 더 많은 라인을 가지는 것이 보통입니다.
6. 컴파일러라는 게 뭐죠? ¶컴파일러는 소스코드를 exe 화일로 바꾸어주는 툴입니다. 최신의 컴파일러들을 몇가지 쓸만한 툴들을 같이 제공하는 것이 보통입니다. 이것은 소스코드 에디터나 디버깅 툴들을 말합니다.
7. 링커가 뭐죠? ¶링커는 컴파일러와 비슷한 역할을 하는 프로그램입니다. 오늘날에는 이것은 컴파일러의 부속품으로 포함되는 것이 보통입니다. 링커는 링킹 처리만을 전담하는데, 이 처리는 소스코드가 컴파일된 후 생성된 이진 화일들과 자원화일, 라이브러리화일등등을 조합하여 exe 화일을 생성하는 작업을 의미합니다.
8. 컴파일러를 어디서 얻을 수 있을까요 ¶구입하세요.상당한 다양한 종류의 컴파일러를 구할 수 있을 겁니다. (Inprise나 Microsoft등등) gnu c++과 같은 공개용 컴파일러들도 구할 수 있으나, 상용보다는 사용하기가 어렵고 까다로운 것이 보통이죠.
9. 어떤 컴파일러가 가장 좋은 컴파일러죠? ¶각각의 컴파일러마다 나름대로의 특징을 가지고 있습니다. 여러분이 선호하는 컴파일러를 고르면 됩니다. 각 컴파일러별로 지원하는 기능의 차이가 약간씩 있으므로 나름대로 비교해보는 것이 좋습니다. 간단한 비교를 하자면,
10. 프로그래밍 언어란 뭐죠? ¶소스코드는 각각의 다른 언어로 쓰여질 수 있습니다. 가장 인기 있는 언어는 C, C++, PASCAL(델파이에서 사용하죠), FORTRAN, BASIC을 들 수 있습니다. 모두 장점, 단점을 가지고 있습니다. 몇몇가지는 배우기 쉽고, 강력한 특징을 가지고 있습니다. 전문적인 프로그래머는 보통 한가지 이상의 언어를 알고 있는 경우가 보통입니다.
11. 무슨 언어를 반드시 익혀야만 하나요? ¶그것은 전적으로 여러분의 선택에 달려있습니다. 단지 한번 해볼까...하는 측면이라면 Microsoft의 비쥬얼 베이직이나 Inprise의 델파이가 좋은 선택이 될 수 있습니다. 하지만 전문적인 프로그래밍에 대한 실력을 높이시려면 반드시 C/C++은 고려해야할 것입니다. 이 언어는 난이도가 있으므로 차근차근 진입하는 것이 좋겠죠.
12. C와 C++언어 사이에 차이점이 무엇이죠? ¶C++은 C에서 약간의 확장 문법을 첨부한 언어입니다. (클래스라고 하죠) 하지만, 이 첨부된 문법덕분에 "객체지향"이라는 아주 진보적인 개념으로 프로그래밍할 수 있게 되었답니다. 기존의 C언어는 "구조적" 방식의 프로그래밍 구조를 택하고 있습니다. 당연한 이야기겠지만, C++을 배우기 전에 C를 먼저 익히시는 것이 좋습니다.
13. 디버깅이란 뭐죠? ¶디버깅이란 버그라고 불리는 프로그램상의 "실수"를 고치는 일을 말합니다. 이것이 "벌래"를 잡는 것만큼 귀찮고 힘든 일이라는 의미에서 이런 이름이 붙게 되었죠. 몇몇 버그는 컴파일러가 알아서 검사한 후 제시하므로 쉽게 고칠 수 있습니다. 하지만 흐름이나 로직상의 버그는 계속 신경써서 고쳐나가야 합니다. 완성된 게임도 계속해서 "patch"라는 것을 내놓는 것을 볼 수 있는데, 이것은 버그의 수정본을 대체하는 것을 의미합니다. 프로그램을 작성하는 것보다 이 버그를 잡는 일이 프로그래머에게는 가장 큰 고역이라고 할 수 있죠. (소화불량이 생길 정도랍니다. ) 일반적으로 프로그램을 작성하는 시간보다 디버깅에 걸리는 시간이 더 많습니다.
14. 어떤 수업이나 과목을 공부해야 할까요? ¶이것도 물론 여러분의 선택에 달려있습니다. 하지만 가능한 많은 과목과 많은 수업을 듣기를 추천합니다. 특히 다음과 같은 과목이 도움이 되겠죠:
15. 게임 개발자는 얼마나 많이 법니까? ¶벌수 있는 한계는 정확히 정할 수는 없습니다만, 수입에 대한 것은 전적으로 그 개발자의 실력에 달려있는 경우가 많습니다. 게임개발에 대한 기술은 상당히 빨리 변하는 경향이 있으므로 살아남기 위해서는 기술에 대한 공부나 구현에 항상 신경을 써주어야 합니다. 대부분의 게임 개발자는 수입보다는 자신의 일에 대한 애착이 중시되는 경우가 많기 때문에 수입이 그리 높지 않다고도 말할 수 있겠죠. 일반적으로 완제품의 상용수준의 게임을 개발할 수 있는 실력이면 상당한 수입을 얻을 수 있지 않을까 생각합니다.
16. 어떻게 게임에 그래픽요소들을 집어넣죠? ¶디자인 산출물을 게임에 적용하는 방법이 상당히 다양하므로, 그것에 따른 라이브러리를 사용하는 것이 보통입니다. 2D 데이타 같은 경우는 이미지를 메모리로 읽어들이기 위한 라이브러리를 사용하는 경우가 일반적입니다. 3D 데이타 같은 경우는 직접 해당 그래픽 저작 툴에 대한 가져오기 툴이나 변환기 프로그램을 만들어서 여러분의 코드로 읽어오는 경우가 일반적입니다. 지금은 라이브러리에서 이런 툴이나 기능을 제공합니다.
17. DirectX가 뭐죠? ¶DirectX는 Microsoft에서 지원하는 게임 및 멀티미디어 전용 라이브러리의 명칭입니다. 이것은 각 역할 별로 몇가지 부분으로 나뉘는데, DirectGraphics, DirectSound, DirectInput등등이 있습니다. 각각, 화면 입출력이나 조이스틱 입력의 처리, 사운드 입출력등등을 담당하며, 만일 윈도우 기반의 게임을 만든다면 거의 필수적인 라이브러리라고 할 수 있습니다. 상당히 윈도우 운영체계에 최적화된 처리를 할 수있다는 장점이 있지만, 배우기 난해하고 라이브러리의 변화의 폭이 큰 까닭에 기술습득이 다소 불편하다는 단점이 있습니다. (이것은 버젼 8에서부터는 다소 나아졌다는 평입니다.)
|