Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

ChangKyu Song

April 28, 2013
Tweet

More Decks by ChangKyu Song

Other Decks in Programming

Transcript

  1. 발표자 소개 송창규 innover 1999 년 한스타 개발 2002 년

    넥슨 입사 2002 년 CA BnB, CA 테트리스 프로그래머 2002 년 디지팡 리드 프로그래머 2004 년 빅샷 리드 프로그래머 2006 년 버블파이터 리드 프로그래머 2010 년 M2 프로그래머
  2. 빌드가 느려요 게임개발의 핵심은 빠른 iteration ! “업데이트좀 받아볼까?” “아

    리빌드다...” “아까 그거 언제 적용돼요?” “20분이면 빌드나와요” 동무 고조 빌드는 어드메쯤 나옵네까?
  3. 느려터진 빌드, 빠르게 할 순 없을까? 빠른 iteration 의 적,

    느린 build time 느려터진 빌드, 빠르게 할 순 없을까? UnityBuild 로 빌드를 빠르게 해보자 ! UnityBuild 로 반토막낼수 있당게!
  4. 오늘 할 이야기 우리가 모르던(간과하던) C++ 의 컴파일의 비밀을 짚어보고

    Hello, World ! We Love Vector ♥ Unity Build 를 간단히 소개한 후 Unity Build 이야기 (사실 C++ 욕) 얼마나 빨라지는데? Unity Build 과정을 단계별로 짚어보겠습니다 STEP 1: 일단 합치기 STEP 2: VS 에서 돌아가게 CHECKPOINT: 문제점 STEP 3: 자동화 STEP 4: 더 큰 프로젝트에서의 자동화
  5. 뭐 이런 식이겠지... WeLoveVector.cpp stdafx.h windows.h stdio.h tchar.h ItemSlots.h vector

    ObjectMgr.h vector WeLoveVector.cpp ItemSlots.cpp stdafx.h windows.h stdio.h tchar.h ItemSlots.h vector ItemSlots.cpp ObjectMgr.cpp stdafx.h windows.h stdio.h tchar.h ObjectMgr.h vector ObjectMgr.cpp
  6. 컴파일러 입력량 WeLoveVector.cpp 255076 Lines stdafx.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.cpp 255057 Lines stdafx.h (224384) windows.h (216849) stdio.h (5439) tchar.h (9474) ItemSlots.h (43581) vector (43831) ItemSlots.cpp (255057) ObjectMgr.cpp 255049 Lines stdafx.h (224384) windows.h (216849) stdio.h (5439) tchar.h (9474) ObjectMgr.h (43851) vector (43831) ObjectMgr.cpp (255049) 저도 처음에 엄청 놀랐습니다 역시 무의미한 빈줄이 많이 포함됨
  7. 컴파일러 입력량 (무의미한 줄 제거 후) WeLoveVector.cpp 66954 Lines stdafx.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.cpp 66960 Lines stdafx.h (57029) windows.h (56488) stdio.h (648) tchar.h (623) ItemSlots.h (11092) vector (11079) ItemSlots.cpp (66960) ObjectMgr.cpp 66952 Lines stdafx.h (57029) windows.h (56488) stdio.h (648) tchar.h (623) ObjectMgr.h (11091) vector (11079) ObjectMgr.cpp (66952) 그래도 67000 여줄!
  8. 파일을 하나로 모으면? WeLoveVector.cpp 66954 Lines stdafx.h windows.h stdio.h tchar.h

    ItemSlots.h vector ObjectMgr.h vector WeLoveVector.cpp ItemSlots.cpp 66960 Lines stdafx.h windows.h stdio.h tchar.h ItemSlots.h vector ItemSlots.cpp ObjectMgr.cpp 66952 Lines stdafx.h windows.h stdio.h tchar.h ObjectMgr.h vector ObjectMgr.cpp ALLInOne.cpp 66999 Lines stdafx.h windows.h stdio.h tchar.h ItemSlots.h vector ObjectMgr.h vector WeLoveVector.cpp ItemSlots.cpp ObjectMgr.cpp 200866 Lines  66999 Lines 이렇게 컴파일 입력을 줄이는 것이 UnityBuild
  9. #include 야말로 8비트 PC 조차 없던 30년 전의 방식 최신기술과

    개념으로 무장해가는 C++ 지만 #include 의 태생은 벗어날 수 없다 코드 재사용을 위해 #include 란걸 만들었다능 컴파일러 다시 안만들어도 됨ㅋ 변수명 줄여 임마 전체메모리 248KB 밖에 없어 최초의 C 탑재 Unix System PDP-11 (1972)
  10. “참조하는만큼 해석하리라” 50개 파일에서 vector<int>를 사용하면?  vector<int> 를 50번

    컴파일 20개 파일에서 Network.h 를 참조하면?  Network.h 를 20번 컴파일 아..폭탄주 땡긴다 이런 언어를 사용하고 있었다니
  11. 릴리즈 약 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배
  12. 디버깅이 안되지 않나요? “결국 VS 만 썼지, 프로젝트 내에서 ALLinOne.cpp

    말고는 다 무시하자는건데... 디버깅 정보가 ALLinOne.obj 에 다 생길텐데...” 브레이크 포인트 잘 잡히나요? F10, F11 잘 되나요?
  13. 디버깅 잘 됩니다! 우리가 header 안의 코드를 디버깅 할 수

    있는 이유 #include 로 만들어진 코드의 디버깅 정보는 해당 소스로 연결돼있다
  14. 문제점 #1 – 너무 큰 입력파일 입력 파일이 너무 크면

    컴파일러 오류 발생 하나로 전부 묶지 말고 나누어 묶으면 된다
  15. 문제점 #2 – 이름 충돌 전역/static 함수와 변수, #define 들의

    충돌 향연 로컬에서만 쓰려고 하던 놈들인데... 적당히 잘 정리해준다 어차피 정리해야할 대상인경우가 많음
  16. 문제점 #3 – #include 누락 #include 빠뜨려도 빌드가 잘된다! 이전줄에서

    이미 #include 가 다 돼있어 다들 겪는문제 Unity Build 없이 빌드해서 색출 해당 cpp 만 컴파일해서 체크 자동화 고려 동작만 하면 되잖겠냐능?
  17. 문제점 #4 – 파일 추가/삭제 새로운 파일이 추가되거나 기존 파일이

    삭제되면 매번 설정해줘야하나요? #include 추가/삭제 “빌드에서 제외” 설정 자동화로 해결
  18. 자동화를 하려면? 자동화 항목 적당한 기준에 따라 파일 나누기 UnityBuildXX.cpp

    로 묶기 프로젝트에 Unity 빌드설정 추가 기존 빌드설정에서 UnityBuildXX.cpp 를 빌드 제외 Unity 빌드설정에서 나머지 .cpp 를 빌드에서 제외
  19. 버블파이터 사례 자동화 항목 버블 파이터 적당한 기준에 따라 파일

    나누기 무조건 10개로 나눔 UnityBuildXX.cpp 로 묶기 UnityMaker 자동화 프로젝트에 Unity 빌드설정 추가 수동 기존 빌드설정에서 UnityBuildXX.cpp 를 빌드 제외 수동 Unity 빌드설정에서 나머지 .cpp 를 빌드에서 제외 UnityMaker 자동화
  20. 버블파이터 UnityMaker (자동화 툴) 빌드 전 이벤트로 실행 10개 파일로

    나누어 묶기 프로젝트 빌드제외 설정 made by brad (유지훈)
  21. 대규모 프로젝트: M2 프로젝트만 44개 ! 빌드설정 두개씩만 추가해도 88개

    UnityBuild 파일 10개씩 등록하면 440개 빌드설정별로 ‘빌드에서 제외’ 설정 Precompiled Header 처리 대부분 과정에 자동화가 필요
  22. M2 프로젝트 사례 자동화 항목 M2 프로젝트 적당한 기준에 따라

    파일 나누기 그룹 설정 후 자동화 UnityBuildXX.cpp 로 묶기 자동화 프로젝트에 Unity 빌드설정 추가 자동화 기존 빌드설정에서 UnityBuildXX.cpp 를 빌드 제외 자동화 Unity 빌드설정에서 나머지 .cpp 를 빌드에서 제외 자동화
  23. M2 UnityMaker 버블파이터의 그것과 기본은 비슷 Project Independant 하게 python

    으로 제작 자동화 추가 커스텀 그루핑 프로젝트 설정 추가 Unity 파일의 추가와 설정 Precompiled Header 설정 컴파일러 설정 추가
  24. M2 Unity Maker 최초 실행시 vcproj 에서 UnityBuildGroup 생성 변경된

    파일만 적용해서 vcproj 와 cpp 로 출력 추가 변경 후 반복 적용가능
  25. 개발자들 python 깔아야 하나요? 매번 돌리지 않아도 됩니다 파일 추가해도

    OK 담당자가 심심할때 돌려줘도 됩니다 After1.cpp After2.cpp 추가