SlideShare a Scribd company logo
1 of 72
Download to read offline
UnityBuild 로
빌드타임 반토막내기

           개발3본부 1실 M2팀
               송창규
발표자 소개
송창규 innover
   1999   년   한스타 개발
   2002   년   넥슨 입사
   2002   년   CA BnB, CA 테트리스 프로그래머
   2002   년   디지팡 리드 프로그래머
   2004   년   빅샷 리드 프로그래머
   2006   년   버블파이터 리드 프로그래머
   2010   년   M2 프로그래머
빌드가 느려요
게임개발의 핵심은 빠른 iteration !

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

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

                  동무 고조 빌드는
                  어드메쯤 나옵네까?
느려터진 빌드, 빠르게 할 순 없을까?
빠른 iteration 의 적, 느린 build time

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

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



                         UnityBuild 로
                        반토막낼수 있당게!
오늘 할 이야기
우리가 모르던(간과하던) C++ 의 컴파일의 비밀을 짚어보고
    Hello, World !
    We Love Vector


Unity Build 를 간단히 소개한 후
    Unity Build 이야기 (사실 C++ 욕)
    얼마나 빨라지는데?


Unity Build 과정을 단계별로 짚어보겠습니다
    STEP 1: 일단 합치기
    STEP 2: VS 에서 돌아가게
    CHECKPOINT: 문제점
    STEP 3: 자동화
    STEP 4: 더 큰 프로젝트에서의 자동화
빌드에 대해 알아봅시다

C++ 컴파일에는 특별한 것이 있다?
Hello, World!
컴파일러 입력량은 어떻게 될까요?
Java   C#    C++
               #include 는
               컴파일 전
               전처리 지시자




  9줄    5줄    11줄
전처리 과정을 알아보려면?
/E, /EP 스위치를 통해서 전처리후 결과를 볼 수 있다
전처리 과정을 알아보자
cl /E HelloWorld.cpp > Preprocessed.cpp
전처리 결과

     뭐야..그거..
     몰라..무서워
대부분은 의미없는 빈줄

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

                  1019 LINES!
컴파일러 입력량은 어떻게 될까요?
Java   C#    C++



             12516줄
  9줄    5줄    (1019줄)
모듈이 여러개라면?
빌드에 대해 알아봅시다

WE LOVE VECTOR!
WeLoveVector.vcproj
간단히 만들어본 샘플 프로젝트
샘플프로젝트 – ObjectMgr
vector<int> 로 삭제할 오브젝트 관리
샘플 프로젝트 - ItemSlots
vector<int> 로 아이템 슬롯 관리
샘플 프로젝트 - WeLoveVector
그것들을 사용하는 목적불명의 모듈
컴파일러는 무슨일을 하고 있을까요?
빌드에 대해 알아봅시다

네 HEADER 를 알라
컴파일러 입력 살펴보기
               Library
               Headers
뭐 이런 식이겠지...

WeLoveVector.cpp     ItemSlots.cpp    ObjectMgr.cpp


     windows.h         windows.h         windows.h
       stdio.h
                         stdio.h          stdio.h
       tchar.h
                         tchar.h          tchar.h
      stdafx.h
       vector           stdafx.h          stdafx.h
    ItemSlots.h
                         vector           vector
       vector
                       ItemSlots.h      ObjectMgr.h
    ObjectMgr.h
  WeLoveVector.cpp    ItemSlots.cpp    ObjectMgr.cpp
255080 LINES ?!
        의미없는 줄을 제거해도
           67000 여줄



              뭐야..그거..
              몰라..무서워
네 Header를 알라


    당연하게 생각하던
   라이브러리의 include...
네 Header를 알라
네 Header를 알라
컴파일러 입력량
                                                저도 처음에 엄청 놀랐습니다
                                             하지만 무의미한 빈줄이 많이 포함돼있음

WeLoveVector.cpp            ItemSlots.cpp             ObjectMgr.cpp
 2555076 lines               255057 lines              255049 lines

    windows.h (216849)        windows.h (216849)        windows.h (216849)

      stdio.h (5439)
                                stdio.h (5439)             stdio.h (5439)
      tchar.h (9474)
                                tchar.h (9474)            tchar.h (9474)
    stdafx.h (224384)

      vector (43831)          stdafx.h (224384)         stdafx.h (224384)

   ItemSlots.h (43581)
                                vector (43831)            vector (43831)
      vector (43831)
                             ItemSlots.h (43581)       ObjectMgr.h (43851)
   ObjectMgr.h (43581)

WeLoveVector.cpp (255076)   ItemSlots.cpp (255057)    ObjectMgr.cpp (255049)
컴파일러 입력량
WeLoveVector.cpp            ItemSlots.cpp            ObjectMgr.cpp
 2555076 lines               255057 lines             255049 lines

    windows.h (216849)        windows.h (216849)       windows.h (216849)

      stdio.h (5439)
                                stdio.h (5439)            stdio.h (5439)
      tchar.h (9474)
                                tchar.h (9474)           tchar.h (9474)
    stdafx.h (224384)

      vector (43831)          stdafx.h (224384)        stdafx.h (224384)

   ItemSlots.h (43581)
                                vector (43831)           vector (43831)
      vector (43831)
                             ItemSlots.h (43581)      ObjectMgr.h (43851)
   ObjectMgr.h (43581)

WeLoveVector.cpp (255076)   ItemSlots.cpp (255057)   ObjectMgr.cpp (255049)
컴파일러 입력량
                            (무의미한 줄 제거 후)                             그래도
                                                                    67000 여줄!

WeLoveVector.cpp               ItemSlots.cpp           ObjectMgr.cpp
  66954 lines                   66960 lines             66952 lines

     windows.h (56488)           windows.h (56488)       windows.h (56488)

       stdio.h (648)
                                   stdio.h (648)            stdio.h (648)
       tchar.h (623)
                                   tchar.h (623)           tchar.h (623)
     stdafx.h (50729)

      vector (11079)             stdafx.h (57029)        stdafx.h (57029)

   ItemSlots.h (11092)
                                   vector (11079)          vector (11079)
      vector (11079)
                                ItemSlots.h (11092)     ObjectMgr.h (11091)
   ObjectMgr.h (11091)

 WeLoveVector.cpp (66954)      ItemSlots.cpp (66960)   ObjectMgr.cpp (66952)
뼛속깊은곳부터 전해오는 배신감

                     날 속였어!

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

모듈을 쪼갤수록 손해라니!
파일을 하나로 모으면?
WeLoveVector.cpp           ItemSlots.cpp       ObjectMgr.cpp     ALLInOne.cpp
  66954 lines               66960 lines         66952 lines      (66999 lines)

      windows.h                windows.h           windows.h         windows.h
                                                                       stdio.h
       stdio.h
                 200866 Lines stdio.h
                                 66999 Lines         stdio.h           tchar.h
       tchar.h
                                                                      stdafx.h
                                tchar.h              tchar.h
      stdafx.h
           이렇게 컴파일 입력을 줄이는 것이                                          vector
       vector                  stdafx.h            stdafx.h          ItemSlot.h

    ItemSlots.h       UnityBuild vector              vector
                                                                       vector
                                                                    ObjectMgr.h
       vector
                              ItemSlots.h         ObjectMgr.h     WeLoveVector.cpp
    ObjectMgr.h
                                                                   ItemSlots.cpp
  WeLoveVector.cpp           ItemSlots.cpp       ObjectMgr.cpp     ObjectMgr.cpp
Unity Build 따라하기

UNITY BUILD – 해보기 전에
찝찝하고 하기싫은 이기분

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

임시땜빵스럽잖아!



         오늘따라
         물내리기가 싫은걸...
#include 야말로 8비트 PC 조차 없던 30년 전의 방식

최신기술과 개념으로 무장해가는 C++ 지만
                           코드 재사용을 위해
#include 의 태생은 벗어날 수 없다    #include 란걸 만들었다능
                           컴파일러 다시 안만들어도 됨ㅋ
             변수명 줄여 임마
             전체메모리
             248KB 밖에 없어




                              최초의 C 탑재 Unix System
                                     PDP-11 (1972)
“참조하는만큼 해석하리라”
50개 파일에서 vector<int>를 사용하면?
 vector<int> 를 50번 컴파일

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



                  아..폭탄주 땡긴다
                  이런 언어를 사용하고 있었다니
쓰면 얼마나 빨라지는데?
버블파이터 프로젝트에 UnityBuild 적용결과




          6:50   1:50


                        73.2% 감소
경이로운 속도향상
릴리즈 약 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배
경이로운 속도향상
대부분의 프로젝트에서 큰 효과
   http://cheind.wordpress.com/2009/12/10/reducing-compilation-time-unity-builds/
기적을 보았습니다




        UnityBuild !!
        어떠케 하는건가요!
Unity Build 따라하기

STEP 1 - 일단 합쳐보자!
한파일로 대동단결!
Unity Build 완료!

참 쉽죠?
하지만...




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

매번 소스 파일 붙여서
파일 새로 만들래?
.cpp 를 include!




  작업은 원 소스 파일에서

  빌드시에만 사용
VS IDE 에서 쓸 수 있나요?
Unity Build 따라하기

STEP 2 - VS 에서 동작하게
새로운 빌드 설정 추가
“빌드에서 제외” 설정




 이렇게 원 소스를 다 제외시켜버리면
 디버깅은 어떻게 하지?
디버깅이 안되지 않나요?
“결국 VS 만 썼지,
 프로젝트 내에서 ALLinOne.cpp 말고는 다 무시하자는건데...
 디버깅 정보가 ALLinOne.obj 에 다 생길텐데...”



브레이크 포인트 잘 잡히나요?
F10, F11 잘 되나요?
디버깅 잘 됩니다!

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




우리가 header 안의 코드를
디버깅 할 수 있는 이유
Unity Build 따라하기

CHECKPOINT – 문제점은 없나요?
문제점 #1 – 너무 큰 입력파일
입력 파일이 너무 크면 컴파일러 오류 발생
  하나로 전부 묶지 말고 나누어 묶으면 된다
문제점 #2 – 이름 충돌
문제점 #2 – 이름 충돌
전역/static 함수와 변수들의 충돌 향연
  로컬에서만 쓰려고 하던 놈들인데...

적당히 잘 정리해준다
  어차피 정리해야할 대상인경우가 많음
문제점 #2 – 이름 충돌
#define, using namespace ?!
   아래 소스들에 전파
   번거롭게 #undef 하나?
   using namespace 는 답이 없다

그냥 묶음을 분리해버리면 된다
   이런경우일수록 naïve 한 마인드가 생산적
   묶음 몇 개 늘어난다고 속도 별로 안느려진다
문제점 #3 – #include 누락
#include 빠뜨려도 빌드가 잘된다!
                              동작만 하면
  이전줄에서 이미 #include 가 다 돼있어   되잖겠냐능?


다들 겪는문제
  Unity Build 없이 빌드해서 색출
  해당 cpp 만 컴파일해서 체크
  자동화 고려
문제점 #4 – 파일 추가/삭제
새로운 파일이 추가되거나 기존 파일이 삭제되면

매번 설정해줘야하나요?
  #include 추가/삭제
  “빌드에서 제외” 설정


자동화로 해결
Unity Build 따라하기

STEP 3 – 자동화를 해보자
자동화를 하려면?
자동화 항목
적당한 기준에 따라 파일 나누기
UnityBuildXX.cpp 로 묶기
프로젝트에 Unity 빌드설정 추가
기존 빌드설정에서 UnityBuildXX.cpp 를 빌드 제외
Unity 빌드설정에서 나머지 .cpp 를 빌드에서 제외
버블파이터 사례
자동화 항목                               버블 파이터
적당한 기준에 따라 파일 나누기                    무조건 10개로 나눔
UnityBuildXX.cpp 로 묶기                UnityMaker 자동화
프로젝트에 Unity 빌드설정 추가                  수동
기존 빌드설정에서 UnityBuildXX.cpp 를 빌드 제외   수동
Unity 빌드설정에서 나머지 .cpp 를 빌드에서 제외      UnityMaker 자동화
버블파이터 UnityMaker
            (자동화 툴)




빌드 전 이벤트로 실행
10개 파일로 나누어 묶기
프로젝트 빌드제외 설정

    made by brad (유지훈)
버블파이터 UnityMaker
소스 파일 목록을 받아와서
10개로 나누어 UnityFile 을 만듦
버블파이터
  UnityMaker


프로젝트 파일을 읽으면서
“빌드에서 제외” 설정

  (vcproj 파일은 xml 형태)
Unity Build 따라하기

STEP 4 – 큰 프로젝트의 자동화
대규모 프로젝트: M2
프로젝트만 44개 !
  빌드설정 두개씩만 추가해도 88개
  UnityBuild 파일 10개씩 등록하면 440개
  빌드설정별로 ‘빌드에서 제외’ 설정
  Precompiled Header 처리


대부분 과정에 자동화가 필요
  반나절이면 프로젝트 하나 끝낸다 싶었는데 44개면..
M2 프로젝트 사례
자동화 항목                               M2 프로젝트
적당한 기준에 따라 파일 나누기                    그룹 설정 후 자동화
UnityBuildXX.cpp 로 묶기                자동화
프로젝트에 Unity 빌드설정 추가                  자동화
기존 빌드설정에서 UnityBuildXX.cpp 를 빌드 제외   자동화
Unity 빌드설정에서 나머지 .cpp 를 빌드에서 제외      자동화
M2 UnityMaker
버블파이터의 그것과 기본은 비슷
  Project Independant 하게
  python 으로 제작


자동화 추가
  커스텀 그루핑
  프로젝트 설정 추가
  Unity 파일의 추가와 설정
  Precompiled Header 설정
  컴파일러 설정 추가
M2 Unity Maker
                               추가 변경 후
                               반복 적용가능




최초 실행시 vcproj 에서         변경된 파일만 적용해서
UnityBuildGroup 생성       vcproj 와 cpp 로 출력
개발자들 python 깔아야 하나요?
매번 돌리지 않아도 됩니다
  파일 추가해도 OK
  담당자만 깔고 생각날때 돌려줘도 됨
  삭제시에는 돌릴 필요 있음
                        After1.cpp
                        After2.cpp
                           추가
빌드 타임 줄이고 행복해지세요~
프로젝트가 매우 크지만 않다면...
 금방 적용 가능합니다
감사합니다




Questions?

More Related Content

What's hot

조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012devCAT Studio, NEXON
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템QooJuice
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremSeungmo Koo
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013devCAT Studio, NEXON
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기Sang Heon Lee
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019devCAT Studio, NEXON
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018devCAT Studio, NEXON
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅DongMin Choi
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기ChangKyu Song
 
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다Lee Dustin
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략YEONG-CHEON YOU
 
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceKGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceXionglong Jin
 
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기강 민우
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr내훈 정
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)Heungsub Lee
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들영욱 오
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버Heungsub Lee
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPSeungmo Koo
 
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템Chaeone Son
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 

What's hot (20)

조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기
 
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceKGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
 
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 

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

[NDC10] Unity Build 로 빌드타임 반토막내기 - 송창규
[NDC10] Unity Build 로 빌드타임 반토막내기 - 송창규[NDC10] Unity Build 로 빌드타임 반토막내기 - 송창규
[NDC10] Unity Build 로 빌드타임 반토막내기 - 송창규ChangKyu Song
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁Yi-kwon Hwang
 
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)Tae Young Lee
 
모던 C++ 정리
모던 C++ 정리모던 C++ 정리
모던 C++ 정리Hansol Kang
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스Sungik Kim
 
V8 add on with middleware modules
V8 add on with middleware modulesV8 add on with middleware modules
V8 add on with middleware modulesJay Kim
 
OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)Jinwook On
 
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) 파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) Tae Young Lee
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11OnGameServer
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유Hwan Min
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 명신 김
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012Esun Kim
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 releaseJaehyeuk Oh
 
Go로 새 프로젝트 시작하기
Go로 새 프로젝트 시작하기Go로 새 프로젝트 시작하기
Go로 새 프로젝트 시작하기Joonsung Lee
 
[W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js
[W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js [W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js
[W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js 양재동 코드랩
 
programming with GDB
programming with GDBprogramming with GDB
programming with GDBNakCheon Jung
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기OnGameServer
 
예제를 통해 쉽게_살펴보는_뷰제이에스
예제를 통해 쉽게_살펴보는_뷰제이에스예제를 통해 쉽게_살펴보는_뷰제이에스
예제를 통해 쉽게_살펴보는_뷰제이에스Dexter Jung
 
Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)Eunbee Song
 

Similar to 송창규, unity build로 빌드타임 반토막내기, NDC2010 (20)

[NDC10] Unity Build 로 빌드타임 반토막내기 - 송창규
[NDC10] Unity Build 로 빌드타임 반토막내기 - 송창규[NDC10] Unity Build 로 빌드타임 반토막내기 - 송창규
[NDC10] Unity Build 로 빌드타임 반토막내기 - 송창규
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
 
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
 
모던 C++ 정리
모던 C++ 정리모던 C++ 정리
모던 C++ 정리
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
V8 add on with middleware modules
V8 add on with middleware modulesV8 add on with middleware modules
V8 add on with middleware modules
 
OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)
 
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) 파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 release
 
Go로 새 프로젝트 시작하기
Go로 새 프로젝트 시작하기Go로 새 프로젝트 시작하기
Go로 새 프로젝트 시작하기
 
[W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js
[W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js [W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js
[W3C HTML5 2017] 예제를 통해 쉽게 살펴보는 Vue.js
 
programming with GDB
programming with GDBprogramming with GDB
programming with GDB
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
 
예제를 통해 쉽게_살펴보는_뷰제이에스
예제를 통해 쉽게_살펴보는_뷰제이에스예제를 통해 쉽게_살펴보는_뷰제이에스
예제를 통해 쉽게_살펴보는_뷰제이에스
 
Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)
 

More from devCAT Studio, NEXON

김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019devCAT Studio, NEXON
 
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019devCAT Studio, NEXON
 
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019devCAT Studio, NEXON
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019devCAT Studio, NEXON
 
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019devCAT Studio, NEXON
 
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019devCAT Studio, NEXON
 
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019devCAT Studio, NEXON
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019devCAT Studio, NEXON
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019devCAT Studio, NEXON
 
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018devCAT Studio, NEXON
 
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018devCAT Studio, NEXON
 
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018devCAT Studio, NEXON
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018devCAT Studio, NEXON
 
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018devCAT Studio, NEXON
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018devCAT Studio, NEXON
 
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012devCAT Studio, NEXON
 
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011devCAT Studio, NEXON
 
백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010devCAT Studio, NEXON
 
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017devCAT Studio, NEXON
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017devCAT Studio, NEXON
 

More from devCAT Studio, NEXON (20)

김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
 
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
 
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
 
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
 
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
 
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
 
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
 
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
 
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
 
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
 
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
 
백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010
 
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
 

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

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