-
Notifications
You must be signed in to change notification settings - Fork 10
/
0237.txt
125 lines (125 loc) · 6.71 KB
/
0237.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
예, 안녕하세요. 포프입니다.
최근에 올렸던 비디오 중에
C++17에 들어오는 모듈 시스템
비디오를 만든적이 있어요
얼마 안 되었는데, 그거에 대해서 제가 한 번
C++의 빌드시간을 빠르게 만들기 위한 흑마법.
이런 얘길 했었거든요.
그래서
물론, 모듈 시스템이 들어올 때까지는,
이제 제대로 될 때까지는 한 1, 2년은 걸릴꺼라고 보고.
더 걸릴수도 있다고 봐요.
코드 베이스를 어떻게 갈아 엎을 수 있냐에 따라.
그래서 이제 그런 흑마법이 뭐냐고 궁금해하시는 분이 있었는데
사실 여러 가지 방법이 있어요.
왜냐하면 일단,
전에도 말했지만 헤더 파일은 복붙인데
그게 두 번 복붙이 되서, cpp 파일이 두 개 있어 가지고
이게 두 개의 오브젝트 파일로 만들어 졌다가,
이 오브젝트가 링킹(Linking)되면서
그 뭐랄까. 헤더가 두 개가 있으면 문제가...
헤더가 두 개가 아니라
임플리멘테이션(implementation) 두 개가 들어가는 문제가 생긴다.
그래서 헤더를 어떻게 어떻게 포함시켜야 되는데
헤더를 포함하면 계속 파일을 긁어서 복붙하는거니까
그 대신에, 그 위에다가
헤더 프로토타입을 똑같이 처놓는 방법도 있다.
그래서 헤더를 보통
헤더 안에서 헤더를 인클루드(include)하는 대신에, 그렇게 전방 선언을 하라고 하죠.
다 좋은 얘기였죠. 근데,
그래도 느리긴 느렸어요. 그래서
뭐 그 다음에 PCH라고 해서 Precompiled Header.
이렇게 해서 미리 헤더를 다 모아놔서
한 통으로 구어 놓은 다음에
모든 cpp에서 이거를 포함을 시키면
다른 헤더 파일을 안 긁으니깐(복사를 안한다)
이게 빠르지 않냐, 그래서 이거를 엄청 남용을 해서
어떤 게임에서는 PCH 파일이 1기가(GB)야
cpp 파일을 하나 넣어서 구울 때마다 1기가 파일을 집어 넣어서 같이 구어야 하는데, 이게 빠를리 없죠.
컴파일러 하다 보면은 비주얼 스튜디오에서 CL.exe가 있어요.
이게 컴파일러거든요,
cpp를 오브젝트로 바꾸는 컴파일러.
그게 8개가 뜨는데, 각자 메모리를 1기가씩 처먹어요.
그게 PCH 파일 때문에 그렇죠.
절대 빠르지 않았어요. 그런 경우에는
그래서 이제
제가 봤던 거 중에 빌드 시스템 중에 가장 빠른 빌드
시스템은 유니티 빌드(Unity Build)였어요.
이 개념은 뭐였나면, 전에도 몇 번 말했을텐데
cpp 파일을 비주얼 스튜디오에 추가하잖아요.
그럼 모든 cpp 파일을 컴파일 안 되는 걸로 꺼요.
오른쪽 버튼을 눌러놓고 속성(Property) 보면은
빌드 액션 이런 거 있거든요.
그럼 컴파일 안 되는 걸로 해놓고,
그 대신에 다른 cpp 파일을 하나 만들어요.
master.cpp
그리고 그 안에서, 이 안에 있던 Cpp 파일있죠.
아까 다 꺼놓은 거
그걸 다 인클루드 다 시켜요.
그럼 어떻게 되냐면, 이 cpp 파일이 시작되면서 다른 cpp파일들을 다 밑에 복붙 해버리고
여기서 다른 헤더를 참조하지만 이 첫번째 파일이
A라는 헤더를 참조 했을 때
보통 #pragma once 이런거 넣거나
#ifndef 해가지고 헤더는 한 번만 포함되게 하니까
두 번째 파일이 포함 될 때는 복붙 안하거든요.
그러면 이미 헤더를 긁는, 그러니깐 첫 번째는 긁지만 두 번째, 세 번째 긁는게 없기 때문에
컴파일러 시간이 엄청 빨라져요
그래서 제가 여태까지 써봤던 방법 중에는
이런 유니티 빌드가 컴파일러 시간이 가장 빨랐고요.
이거를 조금 빠르게 하기 위해서
bat 파일이라던가 아님 C#으로 프로그램 짜서
그... vcproj 파일, 그러니깐
벤쿠버 C, 벤쿠버래 왜 이래.
Visual C Project 파일에 제네레이션(generation)하는 자동으로 만드는 프로그램을 만들어 쓰는 회사도 꽤 있었죠.
이게 제일 빨라요.
모든 게 제일 빨라요.
단점은
그 ctrl + F7 눌러가지고 파일 하나 씩
컴파일 할 수 없다는 거
빌드 구성(Configuration)을 바꿔서 할 수도 있겠지만,
뭐 귀찮고
그래서 제대로 하는 게임 회사에서는 유니티 빌드 정말 많이 썼었어요.
게임 엔진 유니티랑 상관 없습니다.
그리고 이거에 대한 자료는 몇 년전에
넥슨 컨퍼런스에서 발표하신 것도 있어요.
유니티 빌드라고, 그거 보시고.
그 다음에 제가 유니티 빌드를 손작업을 하기 싫어서
열심히 봤던 그 오픈소스 중에 하나가 FASTbuild에요.
FASTbuild라고, 얘는
이제 찾아보시면 나와요.
FASTbuild 해서 Github 쪽에 있었던거 같은데
빌드 성능은 엄청나게 빠르고
기본적으로 유니티 빌드도 지원해요. 그러니까
특별한 거 없이 지원을 해준다고 써있어요.
그래서 저는 봐서 한참 고민을 했어요.
이거를 (프로젝트에) 접목 시킬까
근데
일단 Visual C Project 파일을 import하는 기능이 없고,
그 make 파일처럼 자기가 make 파일을 유지해야 해요.
그래서 근데 그 make 파일을 유지만 해두면은
이거를 일반적으로 하나씩 컴파일 하는거냐, 아니면은
전부를 다 긁어서 유니티 빌드로 만들어서 컴파일 하냐를 자동적으로 해줘가지고,
솔직히 해보고 싶었거든요.
근데 단점은
Visual C Project에 있는
vcproj 파일을 못 불러온다는 거.
뭐 거기에 충분한 정보가 없기 때문에 자기가 못쓴다 이러는데, 그거는 조금은 저는 구라인거 같고
그냥 안 만든 거 같아요. 그래서
그게 되었더라면 참 좋았죠. 내 컴퓨터에서는 그냥 일반적으로 ctrl + F7 눌러서 하나씩 컴파일했다가
유니티 빌드 필요하면 그거 한 번 클릭해가지고,
뭐 bat 파일을 클릭하던가
해서 했으면 됬는데
그래서 그걸 되게 아쉽게 생각을 하고요.
그래서 그 정도 흑마법이 있어요. 사실.
그래서
아직도 뭔가를 해야하는데 빌드 속도가 엄청 느리다
그러면은
헤더 파일을 일일이 따가면서 이거 잘못 했으니깐 지우고 고치기 싫으신 분들은 유니티 빌드가 가장 빠른거 같고요.
모듈 시스템이 빨리 들어오면 좋겠고, 그래서 어차피 포프 티비 말할 목록 중에 FASTbuild가 있었거든요.
모듈 시스템 들어오면 별로 의미 없겠네.
그래서 지금 만들고 말자 해서
비디오를 만든거에요.
포프였고요.
어쨋든 아직도 생각하는
모듈 시스템 굉장히 기대되고 좋네요.
예, 포프였습니다.