[NDC10] Unity Build 로 빌드타임 반토막내기 - 송창규

2,517 views

Published on

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,517
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
19
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

[NDC10] Unity Build 로 빌드타임 반토막내기 - 송창규

  1. 1. UnityBuild 로빌드타임 반토막내기개발3본부 1실 M2팀송창규
  2. 2. 발표자 소개송창규 innover1999 년 한스타 개발2002 년 넥슨 입사2002 년 CA BnB, CA 테트리스 프로그래머2002 년 디지팡 리드 프로그래머2004 년 빅샷 리드 프로그래머2006 년 버블파이터 리드 프로그래머2010 년 M2 프로그래머
  3. 3. 빌드가 느려요게임개발의 핵심은 빠른 iteration !“업데이트좀 받아볼까?” “아 리빌드다...”“아까 그거 언제 적용돼요?” “20분이면 빌드나와요”동무 고조 빌드는어드메쯤 나옵네까?
  4. 4. 느려터진 빌드, 빠르게 할 순 없을까?빠른 iteration 의 적, 느린 build time느려터진 빌드, 빠르게 할 순 없을까?UnityBuild 로 빌드를 빠르게 해보자 !UnityBuild 로반토막낼수 있당게!
  5. 5. 오늘 할 이야기우리가 모르던(간과하던) C++ 의 컴파일의 비밀을 짚어보고Hello, World !We Love Vector ♥Unity Build 를 간단히 소개한 후Unity Build 이야기 (사실 C++ 욕)얼마나 빨라지는데?Unity Build 과정을 단계별로 짚어보겠습니다STEP 1: 일단 합치기STEP 2: VS 에서 돌아가게CHECKPOINT: 문제점STEP 3: 자동화STEP 4: 더 큰 프로젝트에서의 자동화
  6. 6. C++ 컴파일에는 특별한 것이 있다?빌드에 대해 알아봅시다
  7. 7. Hello, World!
  8. 8. 컴파일러 입력량은 어떻게 될까요?Java9줄C#5줄C++11줄#include 는컴파일 전전처리 지시자
  9. 9. 전처리 과정을 알아보려면?/E, /EP 스위치를 통해서 전처리후 결과를 볼 수 있다
  10. 10. 전처리 과정을 알아보자cl /E HelloWorld.cpp > Preprocessed.cpp
  11. 11. 전처리 결과뭐야..그거..몰라..무서워
  12. 12. 의미없는 줄을 제거해도..대부분은 의미없는 빈줄1019 LINES!
  13. 13. 컴파일러 입력량은 어떻게 될까요?Java9줄C#5줄C++12516줄(1019줄)
  14. 14. 모듈이 여러개라면?
  15. 15. WE LOVE VECTOR!빌드에 대해 알아봅시다
  16. 16. WeLoveVector.vcproj간단히 만들어본 샘플 프로젝트
  17. 17. 샘플프로젝트 – ObjectMgrvector<int> 로 삭제할 오브젝트 관리
  18. 18. 샘플 프로젝트 - ItemSlotsvector<int> 로 아이템 슬롯 관리
  19. 19. 샘플 프로젝트 - WeLoveVector그것들을 사용하는 목적불명의 모듈
  20. 20. 컴파일러는 무슨일을 하고 있을까요?
  21. 21. 네 HEADER 를 알라빌드에 대해 알아봅시다
  22. 22. 컴파일러 입력 살펴보기LibraryHeaders
  23. 23. 뭐 이런 식이겠지...WeLoveVector.cppstdafx.hwindows.hstdio.htchar.hItemSlots.hvectorObjectMgr.hvectorWeLoveVector.cppItemSlots.cppstdafx.hwindows.hstdio.htchar.hItemSlots.hvectorItemSlots.cppObjectMgr.cppstdafx.hwindows.hstdio.htchar.hObjectMgr.hvectorObjectMgr.cpp
  24. 24. 255080 LINES ?!뭐야..그거..몰라..무서워의미없는 줄을 제거해도67000 여줄
  25. 25. 네 Header를 알라당연하게 생각하던라이브러리의 include...
  26. 26. 네 Header를 알라
  27. 27. 네 Header를 알라
  28. 28. 컴파일러 입력량WeLoveVector.cpp255076 Linesstdafx.h (224384)windows.h (216849)stdio.h (5439)tchar.h (9474)ItemSlots.h (43581)vector (43831)ObjectMgr.h (43851)vector (43831)WeLoveVector.cpp (255076)ItemSlots.cpp255057 Linesstdafx.h (224384)windows.h (216849)stdio.h (5439)tchar.h (9474)ItemSlots.h (43581)vector (43831)ItemSlots.cpp (255057)ObjectMgr.cpp255049 Linesstdafx.h (224384)windows.h (216849)stdio.h (5439)tchar.h (9474)ObjectMgr.h (43851)vector (43831)ObjectMgr.cpp (255049)저도 처음에 엄청 놀랐습니다역시 무의미한 빈줄이 많이 포함됨
  29. 29. 컴파일러 입력량(무의미한 줄 제거 후)WeLoveVector.cpp66954 Linesstdafx.h (57029)windows.h (56488)stdio.h (648)tchar.h (623)ItemSlots.h (11092)vector (11079)ObjectMgr.h (11091)vector (11079)WeLoveVector.cpp (66954)ItemSlots.cpp66960 Linesstdafx.h (57029)windows.h (56488)stdio.h (648)tchar.h (623)ItemSlots.h (11092)vector (11079)ItemSlots.cpp (66960)ObjectMgr.cpp66952 Linesstdafx.h (57029)windows.h (56488)stdio.h (648)tchar.h (623)ObjectMgr.h (11091)vector (11079)ObjectMgr.cpp (66952)그래도67000 여줄!
  30. 30. 뼛속깊은곳부터 전해오는 배신감모듈을 쪼갤수록 좋은건줄 알았는데모듈을 쪼갤수록 손해라니!날 속였어!
  31. 31. 파일을 하나로 모으면?WeLoveVector.cpp66954 Linesstdafx.hwindows.hstdio.htchar.hItemSlots.hvectorObjectMgr.hvectorWeLoveVector.cppItemSlots.cpp66960 Linesstdafx.hwindows.hstdio.htchar.hItemSlots.hvectorItemSlots.cppObjectMgr.cpp66952 Linesstdafx.hwindows.hstdio.htchar.hObjectMgr.hvectorObjectMgr.cppALLInOne.cpp66999 Linesstdafx.hwindows.hstdio.htchar.hItemSlots.hvectorObjectMgr.hvectorWeLoveVector.cppItemSlots.cppObjectMgr.cpp200866 Lines  66999 Lines이렇게 컴파일 입력을 줄이는 것이UnityBuild
  32. 32. UNITY BUILD – 해보기 전에Unity Build 따라하기
  33. 33. 찝찝하고 하기싫은 이기분한 파일에 꾸역꾸역 몰아넣으라니임시땜빵스럽잖아!오늘따라물내리기가 싫은걸...
  34. 34. #include 야말로 8비트 PC 조차 없던 30년 전의 방식최신기술과 개념으로 무장해가는 C++ 지만#include 의 태생은 벗어날 수 없다코드 재사용을 위해#include 란걸 만들었다능컴파일러 다시 안만들어도 됨ㅋ변수명 줄여 임마전체메모리248KB 밖에 없어최초의 C 탑재 Unix SystemPDP-11 (1972)
  35. 35. “참조하는만큼 해석하리라”50개 파일에서 vector<int>를 사용하면? vector<int> 를 50번 컴파일20개 파일에서 Network.h 를 참조하면? Network.h 를 20번 컴파일아..폭탄주 땡긴다이런 언어를 사용하고 있었다니
  36. 36. 6:50 1:50쓰면 얼마나 빨라지는데?버블파이터 프로젝트에 UnityBuild 적용결과73.2% 감소
  37. 37. 릴리즈 약 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배
  38. 38. 경이로운 속도향상대부분의 프로젝트에서 큰 효과http://cheind.wordpress.com/2009/12/10/reducing-compilation-time-unity-builds/
  39. 39. 기적을 보았습니다UnityBuild !!어떠케 하는건가요!
  40. 40. STEP 1 - 일단 합쳐보자!Unity Build 따라하기
  41. 41. 한파일로 대동단결!
  42. 42. Unity Build 완료!참 쉽죠?
  43. 43. 하지만...한 소스 파일에서 작업할래?매번 소스 파일 붙여서파일 새로 만들래?
  44. 44. .cpp 를 include!작업은 원 소스 파일에서빌드시에만 사용
  45. 45. VS IDE 에서 쓸 수 있나요?
  46. 46. STEP 2 - VS 에서 동작하게Unity Build 따라하기
  47. 47. 새로운 빌드 설정 추가
  48. 48. “빌드에서 제외” 설정이렇게 원 소스를 다 제외시켜버리면디버깅은 어떻게 하지?
  49. 49. 디버깅이 안되지 않나요?“결국 VS 만 썼지,프로젝트 내에서 ALLinOne.cpp 말고는 다 무시하자는건데...디버깅 정보가 ALLinOne.obj 에 다 생길텐데...”브레이크 포인트 잘 잡히나요?F10, F11 잘 되나요?
  50. 50. 디버깅 잘 됩니다!우리가 header 안의 코드를디버깅 할 수 있는 이유#include 로 만들어진 코드의디버깅 정보는 해당 소스로 연결돼있다
  51. 51. CHECKPOINT – 문제점은 없나요?Unity Build 따라하기
  52. 52. 문제점 #1 – 너무 큰 입력파일입력 파일이 너무 크면 컴파일러 오류 발생하나로 전부 묶지 말고 나누어 묶으면 된다
  53. 53. 문제점 #2 – 이름 충돌
  54. 54. 문제점 #2 – 이름 충돌전역/static 함수와 변수, #define 들의 충돌 향연로컬에서만 쓰려고 하던 놈들인데...적당히 잘 정리해준다어차피 정리해야할 대상인경우가 많음
  55. 55. 문제점 #3 – #include 누락#include 빠뜨려도 빌드가 잘된다!이전줄에서 이미 #include 가 다 돼있어다들 겪는문제Unity Build 없이 빌드해서 색출해당 cpp 만 컴파일해서 체크자동화 고려동작만 하면되잖겠냐능?
  56. 56. 문제점 #4 – 파일 추가/삭제새로운 파일이 추가되거나 기존 파일이 삭제되면매번 설정해줘야하나요?#include 추가/삭제“빌드에서 제외” 설정자동화로 해결
  57. 57. STEP 3 – 자동화를 해보자Unity Build 따라하기
  58. 58. 자동화를 하려면?자동화 항목적당한 기준에 따라 파일 나누기UnityBuildXX.cpp 로 묶기프로젝트에 Unity 빌드설정 추가기존 빌드설정에서 UnityBuildXX.cpp 를 빌드 제외Unity 빌드설정에서 나머지 .cpp 를 빌드에서 제외
  59. 59. 버블파이터 사례자동화 항목 버블 파이터적당한 기준에 따라 파일 나누기 무조건 10개로 나눔UnityBuildXX.cpp 로 묶기 UnityMaker 자동화프로젝트에 Unity 빌드설정 추가 수동기존 빌드설정에서 UnityBuildXX.cpp 를 빌드 제외 수동Unity 빌드설정에서 나머지 .cpp 를 빌드에서 제외 UnityMaker 자동화
  60. 60. 버블파이터 UnityMaker(자동화 툴)빌드 전 이벤트로 실행10개 파일로 나누어 묶기프로젝트 빌드제외 설정made by brad (유지훈)
  61. 61. 버블파이터 UnityMaker소스 파일 목록을 받아와서10개로 나누어 UnityFile 을 만듦
  62. 62. 버블파이터UnityMaker프로젝트 파일을 읽으면서“빌드에서 제외” 설정
  63. 63. STEP 4 – 큰 프로젝트의 자동화Unity Build 따라하기
  64. 64. 대규모 프로젝트: M2프로젝트만 44개 !빌드설정 두개씩만 추가해도 88개UnityBuild 파일 10개씩 등록하면 440개빌드설정별로 ‘빌드에서 제외’ 설정Precompiled Header 처리대부분 과정에 자동화가 필요
  65. 65. M2 프로젝트 사례자동화 항목 M2 프로젝트적당한 기준에 따라 파일 나누기 그룹 설정 후 자동화UnityBuildXX.cpp 로 묶기 자동화프로젝트에 Unity 빌드설정 추가 자동화기존 빌드설정에서 UnityBuildXX.cpp 를 빌드 제외 자동화Unity 빌드설정에서 나머지 .cpp 를 빌드에서 제외 자동화
  66. 66. M2 UnityMaker버블파이터의 그것과 기본은 비슷Project Independant 하게python 으로 제작자동화 추가커스텀 그루핑프로젝트 설정 추가Unity 파일의 추가와 설정Precompiled Header 설정컴파일러 설정 추가
  67. 67. M2 Unity Maker최초 실행시 vcproj 에서UnityBuildGroup 생성변경된 파일만 적용해서vcproj 와 cpp 로 출력추가 변경 후반복 적용가능
  68. 68. 개발자들 python 깔아야 하나요?매번 돌리지 않아도 됩니다파일 추가해도 OK담당자가 심심할때 돌려줘도 됩니다After1.cppAfter2.cpp추가
  69. 69. 빌드 타임 줄이고 행복해지세요~프로젝트가 매우 크지만 않다면...금방 적용 가능합니다
  70. 70. 감사합니다Questions?

×