Nexon Ski Camp 2006 게임 프로그래머에게 중요한 것 2006-01-10
A presentation at 2006 넥슨 스키 캠프 특강 in January 2006 in Pyeongchang-gun, Gangwon-do, South Korea by Jubok Kim
Nexon Ski Camp 2006 게임 프로그래머에게 중요한 것 2006-01-10
Nexon Ski Camp 2006 좋은 게임 프로그래머가 되려면? 1
Nexon Ski Camp 2006 게임 프로그래밍을 열심히 해 보면 되나? •테트리스를 만들어본다? •왠지 시시하다 •그렇다고 큰 게임을 만들긴 어렵다 •디자인 리소스는? •DirectX는? 2
Nexon Ski Camp 2006 이런 것들을 알고 있어야 하나? 가비지 컬렉션, Garbage Collection 가상 머신, VM, Virtual Machine 가우시안 블러, Gaussian Blur 감마 커렉션, 감마 보정, Gamma Correction 값으로 호출, Call by Value 고정 파이프라인, FFP, Fixed Function Pipeline 공간 분할, Space Partitioning 광선 추적, Ray-Tracing 구조적 예외 처리, SEH, Structured Exception Handling 그림자 맵, Shadow Mapping 기능 점수 분석, Function Point Analysis 기록 시점 복사, Copy-On-Write 길찾기, Path-Finding 깊이 버퍼, Depth Buffer 깊이 우선 탐색, Depth-First Search 난수, Random Numbers 내부 단편화, Internal Fragmentation 내비게이션 메시, Navigation Meshes 내적, Inner Product, Dot Product 넌 포토리얼리스틱 렌더링, Non-Photorealistic Rendering 넓이 우선 탐색, Breadth-First Search 네임 서버, DNS, Domain Name Server 네임 스페이스, Namespace 다이나믹 캐스트, Dynamic Cast 다이렉트엑스, Microsoft DirectX 단편화, Fragmentation 닷넷 프레임워크, .net Framework 대역폭, Bandwidth 댕글링 포인터, Dangling Pointer 더블 버퍼링, Double Buffering 데드락, Deadlock 데이터 주도적, Data-Driven 데이터베이스 모델링, Database Modeling 동적 링크 라이브러리, DLL, Dynamic Link Library 디버거, Debugger 디버그 심볼, Debug Symbol 디버깅, Debugging 디스플레이스먼트 매핑, Displacement Mapping 디자인 패턴, Design Pattern 래스터라이즈, Rasterize 레이턴시, Latency 레지스터, Register 레퍼런스 카운트, Reference Count 렉서, Lexer 리소스 관리자, Resource Manager 리팩터링, Refactoring 링커, Linker 마이크로스레드, MicroThread 메르센 트위스터, Mersenne-Twister 메모리 맵 파일, Memory Mapped File 메시, Mesh 메시지 큐, Message Queue 메시지 펌프, Message Pump 미니 덤프, Minidump 바쁜 대기, Busy Waiting 바이너리 서치, 이진 검색, Binary Search 바이트 오더 마크, BOM, Byte Order Mark 바이트 오더, Byte Order 반영, Penumbra 반환값 최적화, RVO, Return Value Optimization 백 버퍼, Backbuffer 버그 트래킹 시스템, Bug Tracking System 버텍스 버퍼, Vertex Buffer 버텍스 셰이더, Vertex Shader 범프 매핑, Bump Mapping 법선/접선/종법선, Normal/Tangent/Binormal Vector 병렬 처리, Parallel Processing 병목, Bottleneck 복사 생성자, Copy Constructor 복잡도, Complexity 부정, NAN, Not a Number 비동기, Asynchronous 비디오 램, V-Ram, Video Ram 비트맵, Bitmap 사용자 편의성, Usability 산란, Scattering 상각 상수 시간, Amortized Constant Time 상수 정확성, Const-Correctness 색상/명도/채도, HSV, Hue/Saturation/Value 섀도우 볼륨, Shadow Volume 선입선출, FIFO, First-In First-Out 선형 대수, Linear Algebra 세마포어, Semaphore 세컨드 찬스 익셉션, Second-Chance Exception 소극적 계산법, Lazy Evaluation 순환 순서, Round-Robin 스레드 안전성, Thread-Safeness 스마트 포인터, Smart Pointer 스코프, Scope 스크립트, Script 스택 언와인딩, Stack Unwinding 스택, Stack 스트리밍, Streaming 스프라이트, Sprite 스피큘러, Specular 스핀 락, Spin Lock 시리얼라이즈, Serialize 시야 절두체, 뷰 프루스텀, View Frustum 시야, FoV, Field of View 실행 시점 타입 정보, RTTI, Run-Time Type Information 안티 앨리어싱, Anti-Anliasing 알고리듬, Algorithm 알파 블렌딩, Alpha-Blending 알파 소트, Alpha Sort 암영, Umbra 앨리어싱, Aliasing 앰비언트, Ambient 어서트, Assert 어셈블리, Assembly 역인덱스, Inverted Index 역행렬, Inverse Matrix 연속성, Cn Continuity 예외 안전성, Exception Safeness 오브젝트, Object 오일러 앵글, Euler Angles 오픈지엘, OpenGL 옥트리, Oc-Tree 옵셋, Offset 외부 단편화, External Fragmentation 외적, Outer Product, Cross Product 왼손 좌표계, LeftHanded Coordinate System 요구사항, Requirements 워커 스레드, Worker Thread 워킹셋, Working Set 원근 보정, Perspective Correction 유니코드, Unicode 유한 상태 기계, FSM, Finite State Machine 의사 난수, Pseudo-Random Numbers 이미시브, Emissive 이벤트 주도적, Event-Driven 이진 공간 분할, BSP, Binary Space Partitioning 익스트림 프로그래밍, XP, Extreme Programming 인덱스 버퍼, Index Buffer 인덱스, Index 인라이닝, Inlining 인스턴스, Instance 인터럽트, Interrupt 인터프리터, Interpreter 적극적 계산법, Strict Evaluation 전처리기, Preprocessor 전화면 안티 앨리어싱, FSAA, Full-Screen Anti-Aliasing 전화면 효과, Full Screen Effect 절차적 텍스처, Procedural Texture 정규식, Regular Expression 정규화, Normalize 조명, Lighting 중앙 처리 장치, CPU, Central Processing Unit 지터, Jitter 직렬화, Serialize 짐벌 락, Gimbal Lock 참조 카운트, Reference Count 참조로 호출, Call by Reference 최근 최소 사용, LRU, Least Recently Used 최적화, Optimization 추상 구문 트리, AST, Abstract Syntax Tree 카툰 렌더링, Cartoon Rendering 캐시, Cache 커널, Kernel 컴파일 타임 의존성, Compile-Time Dependency 컴파일러, Compiler 코딩 규약, Coding Convention 콜 스택, Call Stack 콜백, Callback 쾌속 개발 기법, Agile Software Development Process 쾨니그 룩업, Koenig Lookup 쿼드트리, Quad-Tree 쿼리 최적화, Query Optimization 쿼터니언, Quaternion 퀵 소트, Quick Sort 큐, Queue 크리티컬 섹션, Critical Section 테스트 먼저, Test-First 테스트 자동화, Automated Test 테스트 케이스, Testcase 테슬레이션, Tesselation 테일러 급수, Taylor Series 텍스처 압축, Texture Compression 텍스처 필터링, Texture Filtering 텍스처, Texture 템플릿 메타 프로그래밍, Template Meta-Programming 템플릿, Template 파서, Parser 파티클, Particle 패럴랙스 매핑, Parallax Mapping 패치, Patch 퍼스트 찬스 익셉션, First-Chance Exception퍼스펙티브 섀도우 매핑, Perspective Shadow Mapping 퍼포먼스 튜닝, Performance Tuning 페어 프로그래밍, Pair Programming 페이셜 모션, Facial Motion 포토리얼리스틱 렌더링, Photorealistic Rendering 폴링, Polling 표준 템플릿 라이브러리, STL, Standard Template Library 프라이머리 버퍼, Primary Buffer 프레임 레이트, Frame Rate 프레임 버퍼, Frame Buffer 프레임 의존적, Frame-Dependent 프레임 포인터 생략, FPO, Frame Pointer Omission 프로세스, Process 프로젝션 섀도우, Projection Shadow 프로파일링, Profiling 프리미티브, Primitives 프리컴파일드 헤더, PCH, Pre-Compiled Header 프리컴퓨티드 래디언스 트랜스퍼, PRT, PreComputed Radiance Transfer 플랫 셰이딩, Flat Shading 플레이스먼트 뉴, Placement New 피사계 심도, DoF, Depth of Field 피치/롤/요, Pitch/Roll/Yaw 픽셀 단위 연산, Per-Pixel Operation 픽셀 셰이더, Pixel Shader 핌플 이디엄, Pimpl Idiom 해시 충돌, Hash Collision 해시, Hash 해시맵, Hash Map 행렬, Matrix 행렬식, Determinant 헝가리안 명명법, Hungarian Notation 화면 비율, Screen Aspect Ratio 후입선출, LIFO, Last-In First-Out 휘도, Luminance A*, A-Star API, Application Programming Interface ASE, Ascii Scene Export CSS, Cascading Style Sheet DBCS, Double-Byte Character Set DHCP, Dynamic Host Configuration Protocol GB2312 GPU, Graphics Processing Unit HDR, High Dynamic Range HLSL, High Level Shader Language HTML, Hyper-Text Markup Language IA-32, Intel 32bit Architecture IME, Input Method Editor IOCP, Input-Output Completion Port KS5601 LOD, Level of Detail MBCS, Multi-Byte Character Set MD5, Message Digest 5 NAT, Network Address Translation NTSC, National Television Standards Committee OSI 7 계층, OSI 7 Layer PE 포맷, PE Format, Portable Executable Format ROAM, Real-Time Optimally Adapting Meshes SCM, Software Configuration Management SDK, Software Development Kit Shift-JIS SQL, Structured Query Language TCP/IP, Transmission Control Protocol/Internet Protocol UDP, User Datagram Protocol UML, Unified Modeling Language UUID, Universal Unique IDentifier Win32 XML, Extensible Markup Language XSD, XML schema definition 3
Nexon Ski Camp 2006 당연하게도, 회사는 대학 졸업생이 모든 걸 갖추고 오길 기대하진 않는다 4
Nexon Ski Camp 2006 대학에서 모든 걸 배울 순 없다 - 스킬 •대학은 컴퓨터 과학을 가르치는 곳 •컴퓨터 공학을 가르치는 곳이라고 하긴 어렵다 •프로그래밍을 가르치는 곳은 더더욱 아니다 5
Nexon Ski Camp 2006 과학과 공학의 차이점? •과학 •인간이 겪는 경험을 논리적인 체계로 통합한 것 , 조화로운 질서로 나타나는 자연의 미를 추구하는 것, 인간의 경험을 확장하고 그것을 질서로 환원하는 것 •공학 •인류의 이익을 위하여 연구, 경험, 그리고 실무에서 얻어진 수학과 자연 과학의 지식, 재료의 힘을 경제적으로 이용하는 방법을 찾아내는 것 •과학적 지식이나 기술적 수단을 총 동원하여 인간이 직면하고 있는 현실적인 문제 해결의 최종단계 6
Nexon Ski Camp 2006 대학에서 모든 걸 배울 순 없다 - 지식 •게임은 특화된 여러가지 지식을 요구한다 •그래픽 API (DirectX, OpenGL 등) •대규모 네트웍 프로그래밍 (IOCP, 멀티스레딩 등) •Windows 등 플랫폼 지식 •C++ 등 애플리케이션 프로그래밍 스킬 •다른 IT 업체에서 필요한 지식과 다르다 •학생 입장에서는 게임 회사에만 목 매달 수 없다 7
Nexon Ski Camp 2006 대학에서 모든 걸 배울 순 없다 - 경험 •대학에서 만드는 코드는 규모가 작다 •10K LOC (Lines of code) 근방 •팀 규모도 3명 내외 •현업에서는 규모가 큰 코드를 다뤄야 한다 •작은 프로젝트도 보통 100K LOC •15명 정도의 대규모 팀도 있음 •마비노기와 같은 MMORPG의 경우 주석 제외 1M LOC 8
Nexon Ski Camp 2006 그렇다면 무엇이 필요한가? 9
Nexon Ski Camp 2006 현업에서의 예 - 게임 플레이 구현 •기획서 : 폭발하는 몬스터 •하는 이유 •활과 마법의 활용도 증가 •장거리에서 활로 맞춰서 주변 몬스터까지 같이 공격 •다양한 게임플레이 제공 •내용 •죽는 순간 주변으로 폭발을 일으킨다 •장거리 무기로 죽일 경우에는 자신에게 피해가 없고 •폭발을 이용해서 여러 몬스터를 한번에 죽일 수 있다 10
Nexon Ski Camp 2006 사실 이 기획서는 빈 곳 투성이! •연쇄 폭발의 타이밍은? •동시에 일어나는가, 일정 시간을 두고 일어나는가? •폭발 범위는? •몬스터 종류에 따라서 달라지나? •네트워크 시야보다 넓어지기도 하나? •폭발 •폭발 •폭발 •기존 대미지의 대미지 딜링 공식은? 대미지는 어떤 속성? 이펙트의 묘사는 어떻게? 전투 시스템과 별개로 구현해야 하나? 11
Nexon Ski Camp 2006 이걸로 뭔가 만들어 내려면? •기획자에게서 미진한 스펙을 얻어낸다 •A : 연쇄 폭발의 타이밍은 어떻게 됩니까? •B : 가급적 시간을 두고 차례로 폭발했으면 하는데…. •A : 조금 서버에 부담이 생기겠군요. 일단 구현을 해보고 문제 없을 지 다시 판단해야겠네요. 12
Nexon Ski Camp 2006 사소한 과정이 아니다! •앞 페이지의 과정은 반드시 거쳐야 한다! •A : 다 만들었습니다. •B : 오, 어디어디. (…) 아니, 이거 한 번에 폭발하면 안 되고 하나가 폭발한 다음에 시간을 두고 폭발해야 하는데…. •A : 음…. 몬스터를 동시에 폭발시키려고 폭발 범위에 들어오는 몬스터를 한 번에 계산하느라 코드를 많이 변경해서 이제 그렇게 하기 힘든데…. 게다가 시간차를 두고 폭발하려면 스케줄링도 사용해야 하니까 서버에 부담을 많이 준다구요. •B : 그렇다고 이렇게 만들면 근처에 폭발 몬스터를 여럿 배치하면 하나 때리고 난 다음에 도망갈 틈도 없이 플레이어가 죽어버릴 거 아냐. 13
Nexon Ski Camp 2006 이걸로 뭔가 만들다 보면? •기술적인 문제가 생기기도 한다 •폭발 딜레이 스케줄링으로 인한 성능 저하 •해결 방법을 구상한다 •딜레이를 주지 말고 동시에 폭발하게 만들자 •몇 개 단위로 묶어서 스케줄링 수를 줄이자 •서버가 아니라 클라이언트가 폭발 타이밍을 체크하자 •적절한 해결책을 선택한다 •스펙을 조정해야 할 수도 있다 •일정을 조정해야 할 수도 있다 14
Nexon Ski Camp 2006 그러니까 •상세 스펙을 물어보기도 하고 •구현이 어려운 스펙 조정을 요청하기도 하고 •구현하다가 발생한 문제를 파악하고 •문제를 해결할 방법을 찾아내고 •일정이나 스펙 조정을 요청하고 •등…. 15
Nexon Ski Camp 2006 이것 저것 말이 길었지만 정리하자면 16
Nexon Ski Camp 2006 이런 게 필요하겠다 •지금 내가 뭘 해야 하는 건지? •이걸 도대체 어떻게 해결해야 할지? •다음에 좀 더 잘 해결하려면? 17
Nexon Ski Camp 2006 좀 더 정리하자면 •의사 소통 능력 •무슨 일을 언제, 어떻게, 왜 하자는 건지 •문제 해결 능력 •맡은 일을 어떻게 해결할 지 •자기 계발 능력 •같은 일을 좀 더 낫게 할 방법은 없나? •대학은 이런 능력을 습득하기에 좋은 곳이다! 18
Nexon Ski Camp 2006 의사 소통 능력 •팀웍이 필요한 동아리 활동을 한다 •공연, 전시회, 출판, 게임 제작 등 •내용을 전달하는 글쓰기를 연습한다 •학교의 개인 보드나 블로그를 활용 •[한국의 이공계는 글쓰기가 두렵다] •뉴스를 보면서 ‘왜?’, ‘정말인가?’ 생각해 본다 •생각의 빈틈을 남겨두지 않는다 •ex. ‘황우석 교수’ 사건 •생각해 본 결론의 근거를 찾아본다 •논술 공부와 비슷하다 19
Nexon Ski Camp 2006 문제 해결 능력 •어려운 문제를 풀어봐야 한다 •어려운 문제는 깊이 들어가 봐야 나온다 •적어도 한 분야를 깊이 있게 공부한다 •알고리듬? ACM이나 IOI 기출 문제를 풀어보자 •OS? 커널 프로그래밍을 해 보자 •그래픽? 최신 렌더링 기술을 구현해 보자 •언어? 컴파일러와 VM 하나 쯤 구현해 보자 •굳이 게임에 관계있을 필요는 없다 •한 분야를 잘하면 다른 분야에서도 잘 할 것이다! 20
Nexon Ski Camp 2006 자기 계발 능력 •검색 능력은 기본 중의 기본 •무엇을 찾을 수 있고 무엇을 찾을 수 없는가? •정보를 얻는 채널을 만든다 •현업 종사자나 해외 유명 개발자의 블로그, 홈페이지 •개발자 커뮤니티나 메일링 리스트에 가입 •Siggraph, Sigcomm, GDC 등의 컨퍼런스 모니터링 •업계의 소문에 주목한다 •유행하는 책이나 기술 등에 대한 좋은 정보 소스 •자기 계발 능력은 문제 해결 능력에 피드백된다! 21
Nexon Ski Camp 2006 여기에 더해서 기본적인 프로그래밍을 할 줄 알면 된다 22
Nexon Ski Camp 2006 기본적인 프로그래밍은 도대체 뭐지? •게임에 특화된 공부가 꼭 필요한 건 아니다 •[DirectX 9을 이용한 전략 게임 프로그래밍] 류 •분량의 반 절 이상이 DirectX 코드로 이루어져 있다 •차라리 DirectX에 포함된 예제와 CHM을 봐라 •DirectX, 웬만큼 깊이 하지 않았으면 별 의미도 없다 •[초보자를 위한 게임 프로그래밍] 류 •이런 책은 [초보자를 위한 프로그래밍]에 가깝다 •[Game Coding Complete] 류 •여러 분야를 다루긴 하는데 조금씩 아쉽다 •전반적으로 지형도만 그린 다음에 •주제별로 따로 책을 보는 게 낫다 23
Nexon Ski Camp 2006 기본적인 프로그래밍 능력 •문법 책 한 권은 기본이다 •게임 업계에서는 C++을 주로 사용한다 •C++ 표준은 계속해서 진화하고 있다 •[The C++ Programming Language], [C++ Primer] •[STL 튜토리얼 및 레퍼런스 가이드] 등 STL 서적 •스타일 가이드도 덤으로 읽어두면 좋다 •[Effective C++], [Exceptional C++] •[C++ 코딩의 정석] 등 •C#이 앞으로 각광받을 지도 모른다 24
Nexon Ski Camp 2006 기본적인 프로그래밍 능력 •소프트웨어 엔지니어링 책도 기본이다 •프로그래밍은 소프트웨어 공학=엔지니어링이다 •회사를 간다면 어디서나 필요하다 •학교에서 배우는 것과는 조금 다르다 •[GoF의 디자인 패턴], [리팩터링] •[익스트림 프로그래밍 인스톨드] •[조엘 온 소프트웨어] 25
Nexon Ski Camp 2006 기본에 충실한 것이 좋다 26
Nexon Ski Camp 2006 질문? 김주복 (eias@nexon.co.kr) 넥슨 데브캣 스튜디오 그룹웨어 개발팀 팀장 (전 넥슨 데브캣 스튜디오 프로그래밍팀 팀장) 27
Nexon Ski Camp 2006 끝
Nexon Ski Camp 2006 Contents 29