게임 프로그래밍, 알고리즘으로 기초 쌓자

29
게임 프로그래밍 알고리즘으로 기초 쌓기 EXP Games 이재열 And HI-ARC

Upload: jae-yeol-lee

Post on 14-Apr-2017

569 views

Category:

Engineering


11 download

TRANSCRIPT

Page 1: 게임 프로그래밍, 알고리즘으로 기초 쌓자

게임 프로그래밍 알고리즘으로 기초 쌓기

EXP Games 이재열And HI-ARC

Page 2: 게임 프로그래밍, 알고리즘으로 기초 쌓자

목차

❏ 알고리즘이란?

❏ 어떻게 쓰이는가?

❏ 성능 최적화의 측면

❏ 자급 자족의 측면

❏ 알고리즘 -> 문제해결능력

❏ 알고리즘을 어떻게 공부할 것인가?

❏ 결론

www.programming-algorithm.net

lucidchart

Page 3: 게임 프로그래밍, 알고리즘으로 기초 쌓자

알고리즘

Page 4: 게임 프로그래밍, 알고리즘으로 기초 쌓자

알고리즘이란?

- 어떠한 문제(problem)를 해결(solve)하는 동작들의 모임

- 입력, 출력, 정확성, 유한성, 효율성. 5가지 조건을 만족해야함 (Knuth, 1968)

- 입력(Input) : 알고리즘이 시작하기 전에 주어지는 자료의 집합. (배열, 객체, 행렬, 캐릭터 좌표

등등)

- 출력(Output) : 입력과 연관이 있는 결과여야 한다.

- 명확성(Definiteness) : 수행과정은 명확하고 모호하지 않은 명령어로 구성

- 유한성(Finiteness) : 유한 번의 명령어를 실행 후 유한 시간 내에 종결

- 효율성(Effectiveness) : 모든 과정은 명백하게 실행가능한 것이어야 함(even with paper/pencil)

x yf(x)

f

Page 5: 게임 프로그래밍, 알고리즘으로 기초 쌓자

알고리즘 분석- 어떻게?

- 비용 모델 : 동일 비용 모델(수의 크기 상관X) / 대수 비용 모델(비트를 다룸. 얘는 암호학 한정)

- 런타임 분석 : 다양한 입력 크기(입력의 갯수)로 실행한 결과를 벤치마크

- 복잡성(Complexity)

- O(n), Ω(n), Θ(n) 등의 표기법으로 복잡도를 나타냄

- 입력 크기 n에 대한 복잡도 .

- 빅 오 표기법으로 나타낼 경우 차수가 가장 큰 항에서 계수를 생략

- ex) O(2*n^2 + 1) = O(n^2)

- 공간 복잡도(space complexity) : 메모리를 잡아먹는 정도(메모리 할당이 주된 관심)

- 시간 복잡도(time complexity) : 시간을 잡아먹는 정도

- 입력의 크기가 커질수록 성능(속도)의 차이는 점점 커진다

O(n) - 최악의 경우, 상한 점근

Ω(n) - 최선의 경우, 하한 점근

Θ(n) - 평균의 경우

Page 6: 게임 프로그래밍, 알고리즘으로 기초 쌓자

http://qafriend.com/

O(1) Constant

< O(log n) Logarithmic

< O(n) Linear

< O(n log n) linearithmic

< O(n^2) quadratic

< O(2^n) exponential

Page 7: 게임 프로그래밍, 알고리즘으로 기초 쌓자

Example 1 : search (Returning index)seqSearch(arr, elem) {

for(i=0; i<arr.length; ++i)

if(arr[i] == elem) return i;

Return -1;

}

Time complexity : O(n)

binSearch(arr, elem) {

low=0; high=arr.length; mid=(low+high)/2;

while(mid != low) {

if(arr[mid] == elem)

Return mid;

if(arr[mid] > elem)

high = mid;

Else

low = mid;

mid = (low + high) / 2

}

Return -1;

}

Time complexity : O(log n)

Page 8: 게임 프로그래밍, 알고리즘으로 기초 쌓자

Example 2 : Multiplying matrix

A

2367

Page 9: 게임 프로그래밍, 알고리즘으로 기초 쌓자

Why?

Page 10: 게임 프로그래밍, 알고리즘으로 기초 쌓자

도대체 어떻게 쓰이지?

- Everywhere 코어에서부터 하나하나 뜯어서 살펴보면 끝도 없음.

- "짜다보니 쓰이더라"

- 공간분할, 인공지능, 텍스쳐 렌더링, 패키지 배포(DevOps), ...

Page 11: 게임 프로그래밍, 알고리즘으로 기초 쌓자

성능 최적화의 문제- 플레이어의 눈에 보이지 않는 수많은 연산들…

- 네트워크 송수신

- 그래픽스 연산

- AI

- …

- 연산의 횟수/시간 -> 게임의 성능에 치명적인 영향

- 연산 시간 최소화 -> 게임의 성능 향상

- 더 많은 유저에게 빠르게 서비스를 제공

Page 12: 게임 프로그래밍, 알고리즘으로 기초 쌓자

자급 자족의 측면

- 사실은… 게임코디, Gamasutra, 네임드 게임 개발자 블로그 뒤져보면 건져갈

만한 것들이 많음.

- 요즘은 몇몇 라이브러리들이 Github 같은 레포지터리에 오픈소스로 풀려

있어서 공짜로 접근할 수 있음.

- 하지만, 앞으로도 계속 복사/붙여넣기만

할텐가?

Page 13: 게임 프로그래밍, 알고리즘으로 기초 쌓자

자급 자족의 측면- 검색해도 안 나오면 자기가 직접 짤 수 있어야 한다.

- 유명한 여러 기업을 예로 들자면, 사내에서 개발하면서 생긴 문제점들을

해결하기 위해 자체 솔루션을 개발하는 경우가 많음. (이는 오픈소스로

뿌려지기도 함)

- 자급자족을 할 수 있는 것 만으로도 충분한 고급 인력 인증

Page 14: 게임 프로그래밍, 알고리즘으로 기초 쌓자

Case Study #1 (NEXON)- Laszlo : 글로벌로 분산된 환경에서 고속으로 패치 업데이트를 수행

- Python, Go 언어로 작성되어있음

- 마비노기 , 마영전, 메이플 스토리, 아틀란티카 업데이트 할 때 사용되고 있음

- 글로벌 환경이다보니 게임을 한꺼번에 받게 하기에는 속도가 너무 느림

- Rabin-Karp / Adler-32 알고리즘을 이용하여 각 버전에 대한 해시를 구하고, diff를 적용하여

부분적으로 패치

- 수분 걸리던 패치 작업이 초 단위로 줄어드는 매직!

- http://www.slideshare.net/taehyunkim73700/ndc16-61621260

Page 15: 게임 프로그래밍, 알고리즘으로 기초 쌓자

문제해결 능력의

척도로서의 알고리즘

Page 16: 게임 프로그래밍, 알고리즘으로 기초 쌓자

문제 해결 능력의 척도로서의 알고리즘- IT 회사에서 채용공고를 올릴때 프로그래머 부문에서 이와 같은 키워드가 자주

언급됨 '문제 해결 능력이 뛰어나신 분'

- 여기서 문제 해결은? Problem Solving

- 이를 판단하는 척도는? 알고리즘을 얼마나 잘 활용하는가

- 확인하는 방법은 다양하지만 크게 두 가지로 나뉨

- Interview

- Portfolio ( or resume )

Page 17: 게임 프로그래밍, 알고리즘으로 기초 쌓자

 Interview- Handwrite coding

- 왠만하면 C++ / Java 로 코드 작성

- IDE나 Emacs/Vim 로 코드 작성하는 것이 아닌 손으로 일일이 써서 코딩..

- 코드를 막 외우고 다닐 정도가 아닌 이상, 손으로 코딩하는데 익숙해져야 할 필요가 있음.

- 이와는 별개로 해외 기업의 경우, 전화 면접으로 개인의 역량을 측정하는

사례도 여럿 보이고 있음.

Page 18: 게임 프로그래밍, 알고리즘으로 기초 쌓자

Portfolio (or Resume)- 프로그래밍 대회 수상 실적

- ACM ICPC

- Samsung codeground

- Google Code Jam

- Facebook Hackathon

- …

- 공모전 수상 실적

- 토이 프로젝트 혹은 참여/개발했던 오픈소스 프로젝트(혹은 Github, Bitbucket

계정)

- 알고리즘 문제풀이 사이트 계정(Hackerrank, projecteuler, codewars, codeforces,

Codechef, Topcoder, AtCoder, ...)

Page 19: 게임 프로그래밍, 알고리즘으로 기초 쌓자
Page 20: 게임 프로그래밍, 알고리즘으로 기초 쌓자

Or Invitation?- 대외활동을 여러번 하면서 뛰어난 성과를 보인 사람이 누릴 수 있는 특권

- Google Code Jam이나 ACM-ICPC 나가서 상 받았더니 구글에서 초대장이 왔다는 얘기도

심심치 않게 들릴 것임 http://news.mk.co.kr/newsRead.php?year=2015&no=314120

- 몇몇 회사에서는 오픈소스 커미터를 멤버로 끌어들이려는 움직임도 보이며, 쓸만한 인재를

찾기 위해서 자사에서 자체제작한 라이브러리를 오픈소스로 뿌리기도 함.

- "우리 회사에서 이런걸 만들어서 자급자족했는데 , 역시 완성도가 모자란 느낌이다 .

여기에 이슈를 제기하거나 커밋해주는 사람이 있다면 우리와 함께 할 지 적극적으로

고려해볼 것"

- 같은 커뮤니티에서 활동하는 엔지니어에게도 일자리를 얻을 수도 있다....!!!

Page 21: 게임 프로그래밍, 알고리즘으로 기초 쌓자

그럼 알고리즘은

어떻게 공부하지?

Page 22: 게임 프로그래밍, 알고리즘으로 기초 쌓자

알고리즘, 어떻게 공부할 것인가?- Case By Case, 세부적으로 가고자 하는 방향에 따라 다름

- Game AI Programming

- UI/UX Programming

- Game engine?

- 일단 기초적인 것부터 공부하자

- C++로 쓴 자료구조론

- 알고리즘

- 이산수학

- 선형대수학

Page 23: 게임 프로그래밍, 알고리즘으로 기초 쌓자

기초적인 부분을 공부하고 나면?- 코어한 부분도 한번 파고 들어가자!

- 그래프 이론

- 운영체제

- 시스템 프로그래밍

- 함수형 프로그래밍을 비롯한 여러가지 프로그래밍 패러다임

- 디자인 패턴, 도메인 주도 설계

- 학술적인 문서들을 봐야겠다면 수학적인 표기법 숙지는 필수......

- 프로그래밍 언어로 표현할때는 문법이 제각각일지 몰라도, 수학적인 표기법이

Ubiquitous Language로 쓰인다는 점을 명심하자 . (물론, C++/Java를 pseudo 코드로 쓰기도

한다)

Page 24: 게임 프로그래밍, 알고리즘으로 기초 쌓자

전문화....!! 전문화가 필요하다.....!!!- 인공지능? -> 확률/통계, 확률적 알고리즘, 인공지능, 도메인 지식, ...

- 렌더링? -> 수치해석, 그래픽스, 이미지프로세싱, 쉐이더, ...

- 게임엔진? -> 물리, 소프트웨어 아키텍쳐(주로 게임엔진 중심), ...

- 시뮬레이션 게임은 도메인 지식이 필요

- 교육 비용을 별도로 할당해서 도메인 전문가를 끌어들이느냐 ?

- 해당 분야 전공서를 들고 달달 외워서 로직을 작성하느냐?

Page 25: 게임 프로그래밍, 알고리즘으로 기초 쌓자

야, 그럼 실습은 어떻게 하냐?- 알고리즘 문제풀이 사이트 (1)

- 프로젝트 오일러 ( https://projecteuler.net )

- 프로그래밍 언어 제약 X (펜과 종이로 문제 풀어도 됨)

- 수학 문제를 프로그래밍으로 풀고 답을 제출해서 맞추기만 하면 됨.

- 효율성 보다는 구현 위주

- 코드워즈 ( https://www.codewars.com )

- 지원 언어 : Python, Haskell, C#, C++, Java, JS 등 11개 언어

- 8급부터 1급까지 다양하게 난이도가 분포되어 있음.

- 테스트 주도 개발(TDD) 환경 지원.

- 문제를 풀고 나서 상대방과 코드 리뷰할 수 있는 기능 지원

Page 26: 게임 프로그래밍, 알고리즘으로 기초 쌓자

야, 그럼 실습은 어떻게 하냐?- 알고리즘 문제풀이 사이트 (2)

- Baekjoon Online Judge ( https://www.acmicpc.net )

- 지원 언어 : C++/Go/Java/Lua/Python/아희 등 40가지 이상 지원

- 프로그래밍 대회와 유사한 환경 제공.

- 다양한 유형의 알고리즘 문제를 풀어볼 수 있음.

- 세계 각국 정보 올림피아드 , ACM-ICPC를 포함한 여러가지 프로그래밍 대회 기출문제

제공

- CodinGame ( https://www.codingame.com )

- 지원 언어 : C#, C++, Java, JS, Lua 등 20개 언어

- 게임하듯이 프로그래밍할 수 있다. ( PVP / AI )

- 테스트 주도 개발(TDD) 환경 지원.

- 몇몇 유명한 게임 회사들도 눈여겨 본다고도 함

Page 27: 게임 프로그래밍, 알고리즘으로 기초 쌓자

야, 그럼 실습은 어떻게 하냐?- 알고리즘 문제풀이 사이트 (JP)

- Paiza ( https://paiza.jp/ )

- 일본의 프로그래밍 컨설팅(?) 서비스

- 시즌마다 해커톤을 여는데 하나같이 컨셉이 굉장함(항마력 요구)

- "여고생 프로그래밍 대배틀"이라던가 ....

- 문제를 풀면 여캐릭터에게 입힐 옷을 선물받는 미연시 컨셉이라던가 ....

- 사용 언어는 C++/Perl/Java/Ruby/Python/OCaml 등 20가지 언어

- 일본에서 어떤 언어를 쓰는 사람들이 있는지 대략적으로 파악 가능

- Aizu Online Judge ( http://judge.u-aizu.ac.jp/onlinejudge/ )

- 백준져지와 유사

Page 28: 게임 프로그래밍, 알고리즘으로 기초 쌓자

결론

- 게임 프로그래밍은 현실에 존재할 법한 것들을 추상화시켜서 함수로 움직이는

- 이를 모델링하고 돌아가는 원리를 지시하기 위해서, 모델링하고자 하는 사물에 대한 이해가

필요하고 그러한 구현이 왜 필요한지에 대한 이해가 필요함 .

- 이론적으로 알고 있다고 생각할 수도 있지만, 학습에는 실전의 경험도 있어야

함.

- 초보적인 프로그래밍을 할 때는 용어를 중심으로 한 요소, 한 요소 초점을 맞춰서 공부를

했겠지만 , 현실세계는 용어언급은 고사하고 사물을 어떤 구조로 추상화할 지도 엔지니어의

선택이며 , 엔지니어의 선택에 따라 전체적인 시스템의 미래가 결정되기도 함. 수많은 개념들이

한 곳에 어울러져서 돌아가기 때문에, 복잡성이 가득한 시스템을 넓은 시야로 보는 안목도

키울 수 있어야 함

- 머리로만 이해하지 말고, 온 몸으로 이해합시다.

Page 29: 게임 프로그래밍, 알고리즘으로 기초 쌓자

참고자료

- The Art Of Computer Programming - Knuth

- 게임회사의 여럿 채용공고(.....)

- https://career.nexon.com/user/recruit/notice/noticeView?joinCorp=NX&reNo=20160169

- http://www.devsisters.com/jobs/

- https://career.nexon.com/user/recruit/notice/noticeView?joinCorp=NX&reNo=20160005

- NDC 2016 김태현 : 글로벌 퀵 서버패치 이렇게 구현했다- http://www.slideshare.net/taehyunkim73700/ndc16-61621260