Microsoft MVP성태의 닷넷 이야기
VC++: 59. C/C++ 프로젝트 빌드 속도 개선 - UnityBuild를 아세요? [링크 복사], [링크+제목 복사],
조회: 32789
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

C/C++ 프로젝트 빌드 속도 개선 - UnityBuild를 아세요?

오호... ^^ 2월달 마이크로소프트웨어 잡지에 보니 재미있는 내용이 있습니다.

마이크로소프트웨어
 - 게임 개발 사례로 살펴본 C++ 프로젝트의 빌드 속도 개선
; http://www.imaso.co.kr/?doc=bbs/gnuboard.php&wr_id=39176&bo_table=article

다른 것은 그렇다 치고, "UnityBuild"라는 것에 대해 소개하고 있는데요. NDC 2010(넥슨 개발자 컨퍼런스)에서도 UnityBuild에 관한 발표가 있었다고 합니다.

송창규, unity build로 빌드타임 반토막내기, NDC2010
; http://www.slideshare.net/devcatpublications/ndc2010-unity-build

원리는 매우 간단합니다. ^^ CPP 파일을 하나로 묶어서 필요 없는 header 파일의 처리 횟수를 줄이자는 것!

그러면서, Visual Studio를 위해서 "Earlgrey.BuildTools에 포함된 UnityBuild" 도구를 잠깐 언급하고 있는데요.

earlgrey - Providing the fundamental of the online game server. 
; http://code.google.com/p/earlgrey/downloads/list

소개만 할 뿐, 구체적인 사용법이 없어서 ... ^^ 이렇게 제가 소개하는 글을 쓰는 기회를 가로채 보았습니다.




그런데, 소개만 한 데에는 다 이유가 있더군요. ^^ 정말 사용법이 간단합니다. 우선, earlgrey 다운로드 사이트에서 최신의 Earlgrey.BuildTools 파일을 다운로드해 압축을 해제합니다.

일단, 기본적인 내용은 /UserGuid/Help/Earlgrey.Build.Tools.chm 파일에 모두 제공되니 참고하시고.

예를 들기 위해, 단순하게 Visual Studio에서 Visual C++ Windows 프로젝트를 하나 만들었다고 할 때, 보통 다음과 같이 빌드를 해줄 수 있습니다.

D:\TestApp>msbuild testapp.sln

또는

D:\TestApp>msbuild BuildTest.vcxproj

* 좀 더 구체적인 빌드 방법은 다음의 글을 참조.

MSBuild를 이용한 VC++ 프로젝트 빌드
; https://www.sysnet.pe.kr/2/0/871

자, 그럼 위의 프로젝트를 UnityBuild로 해볼까요? ^^ 압축을 풀은 폴더의 /UnityBuild/UnityBuild.ConsoleUi.exe 실행 파일을 이용해서 바로 위에서 msbuild를 수행한 것처럼 적용해 주면 됩니다.

D:\unitybuilder\TestApp>..\Earlgrey.BuildTools\UnityBuild\UnityBuild.ConsoleUi.exe -i testapp.sln
working ...

[Error]
There is an error in XML document (2, 2).

아... 글쎄 ^^ 세상일이 언제나 그렇게 쉽게 되진 않답니다. UnityBuild.ConsoleUi.exe의 명령행 옵션에 보니까 verbose 모드가 있군요. 이걸로 원인을 알 수 있을까요? ^^

D:\unitybuilder\TestApp>..\Earlgrey.BuildTools\UnityBuild\UnityBuild.ConsoleUi.exe -i testapp.sln -v
[Switches]
 * Input file path is "testapp.sln".
 * Verbose mode is turned on.
 * Current optimization level is 'Normal'.

working ...

[Error]
There is an error in XML document (2, 2).

그래도 안되는군요. 설마... Visual Studio 2010을 지원하지 못해서 그러는 것은 아니겠지... 하면서도 혹시나 싶어서, Visual Studio 2008로 C++ 프로젝트를 만들어서 테스트해 보았는데... 오호~~~ 잘 됩니다. ^^

D:\UnityBuild>UnityBuild.ConsoleUi.exe -i .\testapp\TestApp.sln
working ...
converted!

위와 같이 실행하면, TestApp.sln에 포함된 Visual C++ 프로젝트 파일을 다음과 같이 변경해 줍니다.

how_to_use_unitybuild_1.png

잘 보시면, "UnityBuild"라는 논리 폴더가 새롭게 생겼고, 그 하위에 "UnityBuild-00001.cpp"와 "UnityBuild-00002.cpp" 파일을 포함하고 "Excluded from Build" 상태로 설정되어 있습니다.

파일 내용을 보면, 다음과 같습니다.

[UnityBuild-00001.cpp]

#include "StdAfx.h"
#include "stdafx.cpp"

[UnityBuild-00002.cpp]

#include "StdAfx.h"
#include "test1.cpp"
#include "TestApp.cpp"

보시는 것처럼, 원리가 엄청 간단합니다. 일단 stdafx.cpp에 대해서는 파일 하나가 할당되고, 그 외의 CPP 파일들은 하나로 묶이고 있습니다.

위에서는 원본 csproj 파일이 변경되었는데, 별도의 프로젝트 파일이 생성되길 원한다면 다음과 같이 "-c" 옵션을 주면 됩니다.

D:\UnityBuild>UnityBuild.ConsoleUi.exe -i .\testapp\TestApp.sln -c
working ...
converted!

그럼, 새로운 솔루션과 프로젝트 파일이 다음과 같이 생성됩니다.

how_to_use_unitybuild_2.png

TestApp.sln
--> TestApp-UnityBuild.sln

TestApp.vcproj
--> TestApp-UnityBuild.vcproj


그건 그렇다 치고... 그런데 좀 이상하군요. 별도로 생성된 프로젝트조차도 UnityBuild-xxxxx.cpp 파일들이 여전히 "Excluded from Build" 설정으로 되어 있습니다. 이러면 UnityBuild의 효과를 보기 위해서는 일일이 수작업으로 설정을 반대로 해주어야 합니다. (왜 이렇게 만들어 놨을까요? 음... 아직도 이해가 안됩니다.)

결국, 뭉쳐진 파일들로 빌드를 하기 위해서는 다음 그림에서 보는 것처럼, Unity-Build-xxxxx.cpp 파일들이 빌드 대상이 되도록 하고 다른 파일들을 빼주어야 합니다. 또한 이런 경우 "precompiled header" 문제가 발생하는데, 프로젝트 속성 창에서 "Configuration Properties" / "C/C++" / "Precompiled Headers" 범주의 "Create/Use Precompiled Header" 옵션을 기존의 "Use Precompiled Header (/Yu)" 값에서 "Create Precompiled Headers (/Yc)"로 바꿔주어야 합니다.

how_to_use_unitybuild_3.png




"UnityBuild.ConsoleUi.exe" 프로그램이 비록 (내일 모레면 Visual Studio 11 베타 버전이 나오는 마당에 아직도) Visual Studio 2010을 지원하지 않고, 수작업으로 다시 손을 봐야 하는 단점이 있지만, 사실 개념이 워낙 간단하기 때문에 위의 사항을 잘 이해하셨다면 (vcxproj 파일도 XML 형식이기 때문에) 이러한 단점을 수정한 도구를 만드는 것이 그렇게 어렵지 않다는 것을 아실 것입니다.

암튼... 재미난 ^^ 팁을 배웠다는 것만으로도 감사할 일입니다.





[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/5/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2012-03-06 03시02분
[안드로메다토끼] Earlgrey 개발자입니다. 별로 보는 사람도 없고 피드백도 없어서 방치해놨는데 어이 없는 버그가 있었네요. 조만간 고쳐놓으려 합니다. VS10 부터 vcproj 파일의 포맷이 완전히 바뀌어서 밑바닥을 새로 갈아 넣어야 하는 상황이네요. 이게 precomiled header 가 여러 개인 경우라던가 고려할 점이 많아서 생각보다는 개발시간을 많이 잡아먹습니다. ㅠㅠ
[guest]
2012-03-06 03시07분
[안드로메다토끼] 앗, 저도 요즘 안 봐서 잊고 있었는데 이게 버그가 아닙니다. 솔루션 파일을 변경하고 나면 Debug-UnityBuild, Release-UnityBuild 구성 옵션이 생깁니다. 이걸 이용하시면 됩니다. ㅠㅠ
[guest]
2012-03-06 10시18분
아... 그렇군요. ^^ 기왕이면, 솔루션/프로젝트 파일이 복사되는 상황에서는 그냥 기존 구성 옵션을 직접 수정해도 무방하지 않을까 싶습니다. (사실... 구성 옵션 늘어나는 것도 나중에는 관리해야 할 일로 되어버려서. ^^)

참, 그리고 프로젝트 이름 때문에 주개발자가 외국인이고, 한국인은 contributor 식으로 참가하고 있는 줄 알았습니다. ^^
정성태

... 61  62  63  64  65  66  67  68  69  70  71  [72]  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
12169정성태3/5/202020609개발 환경 구성: 473. Windows nanoserver에 대한 docker pull의 태그 사용 [1]
12168정성태3/5/202022179개발 환경 구성: 472. 윈도우 환경에서의 dockerd.exe("Docker Engine" 서비스)가 Linux의 것과 다른 점
12167정성태3/5/202019985개발 환경 구성: 471. C# - 닷넷 응용 프로그램에서 DB2 Express-C 데이터베이스 사용 (3) - ibmcom/db2express-c 컨테이너 사용
12166정성태3/4/202021095개발 환경 구성: 470. Windows Server 컨테이너 - DockerMsftProvider 모듈을 이용한 docker 설치
12165정성태3/2/202019497.NET Framework: 900. 실행 시에 메서드 가로채기 - CLR Injection: Runtime Method Replacer 개선 - 네 번째 이야기(Monitor.Enter 후킹)파일 다운로드1
12164정성태2/29/202020606오류 유형: 598. Surface Pro 6 - Windows Hello Face Software Device가 인식이 안 되는 문제
12163정성태2/27/202018929.NET Framework: 899. 익명 함수를 가리키는 delegate 필드에 대한 직렬화 문제
12162정성태2/26/202023504디버깅 기술: 166. C#에서 만든 COM 객체를 C/C++로 P/Invoke Interop 시 메모리 누수(Memory Leak) 발생 [6]파일 다운로드2
12161정성태2/26/202019281오류 유형: 597. manifest - The value "x64" of attribute "processorArchitecture" in element "assemblyIdentity" is invalid.
12160정성태2/26/202019511개발 환경 구성: 469. Reg-free COM 개체 사용을 위한 manifest 파일 생성 도구 - COMRegFreeManifest
12159정성태2/26/202016041오류 유형: 596. Visual Studio - The project needs to include ATL support
12158정성태2/25/202019337디버깅 기술: 165. C# - Marshal.GetIUnknownForObject/GetIDispatchForObject 사용 시 메모리 누수(Memory Leak) 발생파일 다운로드1
12157정성태2/25/202018742디버깅 기술: 164. C# - Marshal.GetNativeVariantForObject 사용 시 메모리 누수(Memory Leak) 발생 및 해결 방법파일 다운로드1
12156정성태2/25/202017292오류 유형: 595. LINK : warning LNK4098: defaultlib 'nafxcw.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
12155정성태2/25/202017267오류 유형: 594. Warning NU1701 - This package may not be fully compatible with your project
12154정성태2/25/202016407오류 유형: 593. warning LNK4070: /OUT:... directive in .EXP differs from output filename
12153정성태2/23/202020959.NET Framework: 898. Trampoline을 이용한 후킹의 한계파일 다운로드1
12152정성태2/23/202019344.NET Framework: 897. 실행 시에 메서드 가로채기 - CLR Injection: Runtime Method Replacer 개선 - 세 번째 이야기(Trampoline 후킹)파일 다운로드1
12151정성태2/22/202020702.NET Framework: 896. C# - Win32 API를 Trampoline 기법을 이용해 C# 메서드로 가로채는 방법 - 두 번째 이야기 (원본 함수 호출)파일 다운로드1
12150정성태2/21/202021086.NET Framework: 895. C# - Win32 API를 Trampoline 기법을 이용해 C# 메서드로 가로채는 방법 [1]파일 다운로드1
12149정성태2/20/202019118.NET Framework: 894. eBEST C# XingAPI 래퍼 - 연속 조회 처리 방법 [1]
12148정성태2/19/202022379디버깅 기술: 163. x64 환경에서 구현하는 다양한 Trampoline 기법 [1]
12147정성태2/19/202019305디버깅 기술: 162. x86/x64의 기계어 코드 최대 길이
12146정성태2/18/202020214.NET Framework: 893. eBEST C# XingAPI 래퍼 - 로그인 처리파일 다운로드1
12145정성태2/18/202020713.NET Framework: 892. eBEST C# XingAPI 래퍼 - Sqlite 지원 추가파일 다운로드1
12144정성태2/13/202020913.NET Framework: 891. 실행 시에 메서드 가로채기 - CLR Injection: Runtime Method Replacer 개선 - 두 번째 이야기파일 다운로드1
... 61  62  63  64  65  66  67  68  69  70  71  [72]  73  74  75  ...