송창규, unity build로 빌드타임 반토막내기, ndc2010

72
UnityBuild 빌드타임 반토막내기 개발3본부 1M2송창규

Upload: devcat-studio-nexon

Post on 12-Apr-2017

21.522 views

Category:

Education


4 download

TRANSCRIPT

Page 1: 송창규, unity build로 빌드타임 반토막내기, NDC2010

UnityBuild 로

빌드타임 반토막내기

개발3본부 1실 M2팀

송창규

Page 2: 송창규, unity build로 빌드타임 반토막내기, NDC2010

발표자 소개

송창규 innover

1999 년 한스타 개발

2002 년 넥슨 입사

2002 년 CA BnB, CA 테트리스 프로그래머

2002 년 디지팡 리드 프로그래머

2004 년 빅샷 리드 프로그래머

2006 년 버블파이터 리드 프로그래머

2010 년 M2 프로그래머

Page 3: 송창규, unity build로 빌드타임 반토막내기, NDC2010

빌드가 느려요

게임개발의 핵심은 빠른 iteration !

“업데이트좀 받아볼까?” “아 리빌드다...”

“아까 그거 언제 적용돼요?” “20분이면 빌드나와요”

동무 고조 빌드는어드메쯤 나옵네까?

Page 4: 송창규, unity build로 빌드타임 반토막내기, NDC2010

느려터진 빌드, 빠르게 할 순 없을까?

빠른 iteration 의 적, 느린 build time

느려터진 빌드, 빠르게 할 순 없을까?

UnityBuild 로 빌드를 빠르게 해보자 !

UnityBuild 로반토막낼수 있당게!

Page 5: 송창규, unity build로 빌드타임 반토막내기, NDC2010

오늘 할 이야기

우리가 모르던(간과하던) C++ 의 컴파일의 비밀을 짚어보고Hello, World !

We Love Vector

Unity Build 를 간단히 소개한 후Unity Build 이야기 (사실 C++ 욕)

얼마나 빨라지는데?

Unity Build 과정을 단계별로 짚어보겠습니다STEP 1: 일단 합치기

STEP 2: VS 에서 돌아가게

CHECKPOINT: 문제점

STEP 3: 자동화

STEP 4: 더 큰 프로젝트에서의 자동화

Page 6: 송창규, unity build로 빌드타임 반토막내기, NDC2010

C++ 컴파일에는 특별한 것이 있다?

빌드에 대해 알아봅시다

Page 7: 송창규, unity build로 빌드타임 반토막내기, NDC2010

Hello, World!

Page 8: 송창규, unity build로 빌드타임 반토막내기, NDC2010

컴파일러 입력량은 어떻게 될까요?

Java

9줄

C#

5줄

C++

11줄

#include 는컴파일 전전처리 지시자

Page 9: 송창규, unity build로 빌드타임 반토막내기, NDC2010

전처리 과정을 알아보려면?

/E, /EP 스위치를 통해서 전처리후 결과를 볼 수 있다

Page 10: 송창규, unity build로 빌드타임 반토막내기, NDC2010

전처리 과정을 알아보자

cl /E HelloWorld.cpp > Preprocessed.cpp

Page 11: 송창규, unity build로 빌드타임 반토막내기, NDC2010

전처리 결과

뭐야..그거..몰라..무서워

Page 12: 송창규, unity build로 빌드타임 반토막내기, NDC2010

의미없는 줄을 제거해도..

대부분은 의미없는 빈줄

1019 LINES!

Page 13: 송창규, unity build로 빌드타임 반토막내기, NDC2010

컴파일러 입력량은 어떻게 될까요?

Java

9줄

C#

5줄

C++

12516줄(1019줄)

Page 14: 송창규, unity build로 빌드타임 반토막내기, NDC2010

모듈이 여러개라면?

Page 15: 송창규, unity build로 빌드타임 반토막내기, NDC2010

WE LOVE VECTOR!

빌드에 대해 알아봅시다

Page 16: 송창규, unity build로 빌드타임 반토막내기, NDC2010

WeLoveVector.vcproj

간단히 만들어본 샘플 프로젝트

Page 17: 송창규, unity build로 빌드타임 반토막내기, NDC2010

샘플프로젝트 – ObjectMgr

vector<int> 로 삭제할 오브젝트 관리

Page 18: 송창규, unity build로 빌드타임 반토막내기, NDC2010

샘플 프로젝트 - ItemSlots

vector<int> 로 아이템 슬롯 관리

Page 19: 송창규, unity build로 빌드타임 반토막내기, NDC2010

샘플 프로젝트 - WeLoveVector

그것들을 사용하는 목적불명의 모듈

Page 20: 송창규, unity build로 빌드타임 반토막내기, NDC2010

컴파일러는 무슨일을 하고 있을까요?

Page 21: 송창규, unity build로 빌드타임 반토막내기, NDC2010

네 HEADER 를 알라

빌드에 대해 알아봅시다

Page 22: 송창규, unity build로 빌드타임 반토막내기, NDC2010

컴파일러 입력 살펴보기LibraryHeaders

Page 23: 송창규, unity build로 빌드타임 반토막내기, NDC2010

뭐 이런 식이겠지...

WeLoveVector.cpp

windows.h

stdio.h

tchar.h

stdafx.h

vector

ItemSlots.h

vector

ObjectMgr.h

WeLoveVector.cpp

ItemSlots.cpp

windows.h

stdio.h

tchar.h

stdafx.h

vector

ItemSlots.h

ItemSlots.cpp

ObjectMgr.cpp

windows.h

stdio.h

tchar.h

stdafx.h

vector

ObjectMgr.h

ObjectMgr.cpp

Page 24: 송창규, unity build로 빌드타임 반토막내기, NDC2010

255080 LINES ?!

뭐야..그거..몰라..무서워

의미없는 줄을 제거해도67000 여줄

Page 25: 송창규, unity build로 빌드타임 반토막내기, NDC2010

네 Header를 알라

당연하게 생각하던

라이브러리의 include...

Page 26: 송창규, unity build로 빌드타임 반토막내기, NDC2010

네 Header를 알라

Page 27: 송창규, unity build로 빌드타임 반토막내기, NDC2010

네 Header를 알라

Page 28: 송창규, unity build로 빌드타임 반토막내기, NDC2010

컴파일러 입력량

WeLoveVector.cpp2555076 lines

windows.h (216849)

stdio.h (5439)

tchar.h (9474)

stdafx.h (224384)

vector (43831)

ItemSlots.h (43581)

vector (43831)

ObjectMgr.h (43581)

WeLoveVector.cpp (255076)

ItemSlots.cpp255057 lines

windows.h (216849)

stdio.h (5439)

tchar.h (9474)

stdafx.h (224384)

vector (43831)

ItemSlots.h (43581)

ItemSlots.cpp (255057)

ObjectMgr.cpp255049 lines

windows.h (216849)

stdio.h (5439)

tchar.h (9474)

stdafx.h (224384)

vector (43831)

ObjectMgr.h (43851)

ObjectMgr.cpp (255049)

저도 처음에 엄청 놀랐습니다하지만 무의미한 빈줄이 많이 포함돼있음

Page 29: 송창규, unity build로 빌드타임 반토막내기, NDC2010

컴파일러 입력량

WeLoveVector.cpp2555076 lines

windows.h (216849)

stdio.h (5439)

tchar.h (9474)

stdafx.h (224384)

vector (43831)

ItemSlots.h (43581)

vector (43831)

ObjectMgr.h (43581)

WeLoveVector.cpp (255076)

ItemSlots.cpp255057 lines

windows.h (216849)

stdio.h (5439)

tchar.h (9474)

stdafx.h (224384)

vector (43831)

ItemSlots.h (43581)

ItemSlots.cpp (255057)

ObjectMgr.cpp255049 lines

windows.h (216849)

stdio.h (5439)

tchar.h (9474)

stdafx.h (224384)

vector (43831)

ObjectMgr.h (43851)

ObjectMgr.cpp (255049)

Page 30: 송창규, unity build로 빌드타임 반토막내기, NDC2010

컴파일러 입력량(무의미한 줄 제거 후)

WeLoveVector.cpp66954 lines

windows.h (56488)

stdio.h (648)

tchar.h (623)

stdafx.h (50729)

vector (11079)

ItemSlots.h (11092)

vector (11079)

ObjectMgr.h (11091)

WeLoveVector.cpp (66954)

ItemSlots.cpp66960 lines

windows.h (56488)

stdio.h (648)

tchar.h (623)

stdafx.h (57029)

vector (11079)

ItemSlots.h (11092)

ItemSlots.cpp (66960)

ObjectMgr.cpp66952 lines

windows.h (56488)

stdio.h (648)

tchar.h (623)

stdafx.h (57029)

vector (11079)

ObjectMgr.h (11091)

ObjectMgr.cpp (66952)

그래도67000 여줄!

Page 31: 송창규, unity build로 빌드타임 반토막내기, NDC2010

뼛속깊은곳부터 전해오는 배신감

모듈을 쪼갤수록 좋은건줄 알았는데

모듈을 쪼갤수록 손해라니!

날 속였어!

Page 32: 송창규, unity build로 빌드타임 반토막내기, NDC2010

WeLoveVector.cpp66954 lines

windows.h

stdio.h

tchar.h

stdafx.h

vector

ItemSlots.h

vector

ObjectMgr.h

WeLoveVector.cpp

ItemSlots.cpp66960 lines

windows.h

stdio.h

tchar.h

stdafx.h

vector

ItemSlots.h

ItemSlots.cpp

ObjectMgr.cpp66952 lines

windows.h

stdio.h

tchar.h

stdafx.h

vector

ObjectMgr.h

ObjectMgr.cpp

ALLInOne.cpp(66999 lines)

windows.h

stdio.h

tchar.h

stdafx.h

vector

ItemSlot.h

vector

ObjectMgr.h

WeLoveVector.cpp

ItemSlots.cpp

ObjectMgr.cpp

파일을 하나로 모으면?

200866 Lines 66999 Lines

이렇게 컴파일 입력을 줄이는 것이

UnityBuild

Page 33: 송창규, unity build로 빌드타임 반토막내기, NDC2010

UNITY BUILD – 해보기 전에

Unity Build 따라하기

Page 34: 송창규, unity build로 빌드타임 반토막내기, NDC2010

찝찝하고 하기싫은 이기분

한 파일에 꾸역꾸역 몰아넣으라니

임시땜빵스럽잖아!

오늘따라물내리기가 싫은걸...

Page 35: 송창규, unity build로 빌드타임 반토막내기, NDC2010

#include 야말로 8비트 PC 조차 없던 30년 전의 방식

최신기술과 개념으로 무장해가는 C++ 지만

#include 의 태생은 벗어날 수 없다코드 재사용을 위해#include 란걸 만들었다능컴파일러 다시 안만들어도 됨ㅋ

변수명 줄여 임마전체메모리248KB 밖에 없어

최초의 C 탑재 Unix SystemPDP-11 (1972)

Page 36: 송창규, unity build로 빌드타임 반토막내기, NDC2010

“참조하는만큼 해석하리라”

50개 파일에서 vector<int>를 사용하면?

vector<int> 를 50번 컴파일

20개 파일에서 Network.h 를 참조하면?

Network.h 를 20번 컴파일

아..폭탄주 땡긴다이런 언어를 사용하고 있었다니

Page 37: 송창규, unity build로 빌드타임 반토막내기, NDC2010

6:50 1:50

쓰면 얼마나 빨라지는데?

버블파이터 프로젝트에 UnityBuild 적용결과

73.2% 감소

Page 38: 송창규, unity build로 빌드타임 반토막내기, NDC2010

릴리즈 약 2배 향상

디버그는 3배 이상

경이로운 속도향상

프로젝트 BEFORE AFTER 감소율 속도차

Quake Wars 2:20 0:38 72.9% 감소 3.7배

Irrlicht 엔진 1:23 0:28 66.3% 감소 3.0배

프로젝트 A 약 30분 약 2~3분 91.7% 감소 12.0배

프로젝트 B 약 10분 3분이내 70.0% 감소 3.3배

버블파이터 6:50 1:50 73.2% 감소 3.7배

M2 Library A 0:55 0:18 67.3% 감소 3.0배

Page 39: 송창규, unity build로 빌드타임 반토막내기, NDC2010

경이로운 속도향상

대부분의 프로젝트에서 큰 효과http://cheind.wordpress.com/2009/12/10/reducing-compilation-time-unity-builds/

Page 40: 송창규, unity build로 빌드타임 반토막내기, NDC2010

기적을 보았습니다

UnityBuild !!어떠케 하는건가요!

Page 41: 송창규, unity build로 빌드타임 반토막내기, NDC2010

STEP 1 - 일단 합쳐보자!

Unity Build 따라하기

Page 42: 송창규, unity build로 빌드타임 반토막내기, NDC2010

한파일로 대동단결!

Page 43: 송창규, unity build로 빌드타임 반토막내기, NDC2010

Unity Build 완료!

참 쉽죠?

Page 44: 송창규, unity build로 빌드타임 반토막내기, NDC2010

하지만...

한 소스 파일에서 작업할래?

매번 소스 파일 붙여서

파일 새로 만들래?

Page 45: 송창규, unity build로 빌드타임 반토막내기, NDC2010

.cpp 를 include!

작업은 원 소스 파일에서

빌드시에만 사용

Page 46: 송창규, unity build로 빌드타임 반토막내기, NDC2010

VS IDE 에서 쓸 수 있나요?

Page 47: 송창규, unity build로 빌드타임 반토막내기, NDC2010

STEP 2 - VS 에서 동작하게

Unity Build 따라하기

Page 48: 송창규, unity build로 빌드타임 반토막내기, NDC2010

새로운 빌드 설정 추가

Page 49: 송창규, unity build로 빌드타임 반토막내기, NDC2010

“빌드에서 제외” 설정

이렇게 원 소스를 다 제외시켜버리면디버깅은 어떻게 하지?

Page 50: 송창규, unity build로 빌드타임 반토막내기, NDC2010

디버깅이 안되지 않나요?

“결국 VS 만 썼지,

프로젝트 내에서 ALLinOne.cpp 말고는 다 무시하자는건데...

디버깅 정보가 ALLinOne.obj 에 다 생길텐데...”

브레이크 포인트 잘 잡히나요?

F10, F11 잘 되나요?

Page 51: 송창규, unity build로 빌드타임 반토막내기, NDC2010

디버깅 잘 됩니다!

우리가 header 안의 코드를

디버깅 할 수 있는 이유

#include 로 만들어진 코드의디버깅 정보는 해당 소스로 연결돼있다

Page 52: 송창규, unity build로 빌드타임 반토막내기, NDC2010

CHECKPOINT – 문제점은 없나요?

Unity Build 따라하기

Page 53: 송창규, unity build로 빌드타임 반토막내기, NDC2010

문제점 #1 – 너무 큰 입력파일

입력 파일이 너무 크면 컴파일러 오류 발생

하나로 전부 묶지 말고 나누어 묶으면 된다

Page 54: 송창규, unity build로 빌드타임 반토막내기, NDC2010

문제점 #2 – 이름 충돌

Page 55: 송창규, unity build로 빌드타임 반토막내기, NDC2010

문제점 #2 – 이름 충돌

전역/static 함수와 변수들의 충돌 향연

로컬에서만 쓰려고 하던 놈들인데...

적당히 잘 정리해준다

어차피 정리해야할 대상인경우가 많음

Page 56: 송창규, unity build로 빌드타임 반토막내기, NDC2010

문제점 #2 – 이름 충돌

#define, using namespace ?!

아래 소스들에 전파

번거롭게 #undef 하나?

using namespace 는 답이 없다

그냥 묶음을 분리해버리면 된다

이런경우일수록 naïve 한 마인드가 생산적

묶음 몇 개 늘어난다고 속도 별로 안느려진다

Page 57: 송창규, unity build로 빌드타임 반토막내기, NDC2010

문제점 #3 – #include 누락

#include 빠뜨려도 빌드가 잘된다!

이전줄에서 이미 #include 가 다 돼있어

다들 겪는문제

Unity Build 없이 빌드해서 색출

해당 cpp 만 컴파일해서 체크

자동화 고려

동작만 하면되잖겠냐능?

Page 58: 송창규, unity build로 빌드타임 반토막내기, NDC2010

문제점 #4 – 파일 추가/삭제

새로운 파일이 추가되거나 기존 파일이 삭제되면

매번 설정해줘야하나요?

#include 추가/삭제

“빌드에서 제외” 설정

자동화로 해결

Page 59: 송창규, unity build로 빌드타임 반토막내기, NDC2010

STEP 3 – 자동화를 해보자

Unity Build 따라하기

Page 60: 송창규, unity build로 빌드타임 반토막내기, NDC2010

자동화를 하려면?

자동화 항목

적당한 기준에 따라 파일 나누기

UnityBuildXX.cpp 로 묶기

프로젝트에 Unity 빌드설정 추가

기존 빌드설정에서 UnityBuildXX.cpp 를 빌드 제외

Unity 빌드설정에서 나머지 .cpp 를 빌드에서 제외

Page 61: 송창규, unity build로 빌드타임 반토막내기, NDC2010

버블파이터 사례

자동화 항목 버블 파이터

적당한 기준에 따라 파일 나누기 무조건 10개로 나눔

UnityBuildXX.cpp 로 묶기 UnityMaker 자동화

프로젝트에 Unity 빌드설정 추가 수동

기존 빌드설정에서 UnityBuildXX.cpp 를 빌드 제외 수동

Unity 빌드설정에서 나머지 .cpp 를 빌드에서 제외 UnityMaker 자동화

Page 62: 송창규, unity build로 빌드타임 반토막내기, NDC2010

버블파이터 UnityMaker(자동화 툴)

빌드 전 이벤트로 실행

10개 파일로 나누어 묶기

프로젝트 빌드제외 설정

made by brad (유지훈)

Page 63: 송창규, unity build로 빌드타임 반토막내기, NDC2010

버블파이터 UnityMaker

소스 파일 목록을 받아와서

10개로 나누어 UnityFile 을 만듦

Page 64: 송창규, unity build로 빌드타임 반토막내기, NDC2010

버블파이터UnityMaker

프로젝트 파일을 읽으면서

“빌드에서 제외” 설정

(vcproj 파일은 xml 형태)

Page 65: 송창규, unity build로 빌드타임 반토막내기, NDC2010

STEP 4 – 큰 프로젝트의 자동화

Unity Build 따라하기

Page 66: 송창규, unity build로 빌드타임 반토막내기, NDC2010

대규모 프로젝트: M2

프로젝트만 44개 !빌드설정 두개씩만 추가해도 88개

UnityBuild 파일 10개씩 등록하면 440개

빌드설정별로 ‘빌드에서 제외’ 설정

Precompiled Header 처리

대부분 과정에 자동화가 필요반나절이면 프로젝트 하나 끝낸다 싶었는데 44개면..

Page 67: 송창규, unity build로 빌드타임 반토막내기, NDC2010

M2 프로젝트 사례

자동화 항목 M2 프로젝트

적당한 기준에 따라 파일 나누기 그룹 설정 후 자동화

UnityBuildXX.cpp 로 묶기 자동화

프로젝트에 Unity 빌드설정 추가 자동화

기존 빌드설정에서 UnityBuildXX.cpp 를 빌드 제외 자동화

Unity 빌드설정에서 나머지 .cpp 를 빌드에서 제외 자동화

Page 68: 송창규, unity build로 빌드타임 반토막내기, NDC2010

M2 UnityMaker

버블파이터의 그것과 기본은 비슷

Project Independant 하게

python 으로 제작

자동화 추가

커스텀 그루핑

프로젝트 설정 추가

Unity 파일의 추가와 설정

Precompiled Header 설정

컴파일러 설정 추가

Page 69: 송창규, unity build로 빌드타임 반토막내기, NDC2010

M2 Unity Maker

최초 실행시 vcproj 에서UnityBuildGroup 생성

변경된 파일만 적용해서vcproj 와 cpp 로 출력

추가 변경 후반복 적용가능

Page 70: 송창규, unity build로 빌드타임 반토막내기, NDC2010

개발자들 python 깔아야 하나요?

매번 돌리지 않아도 됩니다

파일 추가해도 OK

담당자만 깔고 생각날때 돌려줘도 됨

삭제시에는 돌릴 필요 있음After1.cppAfter2.cpp

추가

Page 71: 송창규, unity build로 빌드타임 반토막내기, NDC2010

빌드 타임 줄이고 행복해지세요~

프로젝트가 매우 크지만 않다면...

금방 적용 가능합니다

Page 72: 송창규, unity build로 빌드타임 반토막내기, NDC2010

감사합니다

Questions?