컴파일러 최적화
GameMaker는 게임을 컴파일(즉, 빌드)할 때 게임 코드의 일부를 최적화합니다. 일부 최적화는 자동으로 수행되며, 다른 일부는 gml_pragma를 호출하여 켜거나 끌 수 있습니다.
자동 최적화
컴파일러는 특정 최적화를 자동으로 수행하며, 이는 재귀적으로 이루어집니다:
- 구조체 변수는 컴파일 시간에 상수 값으로 해결되는 경우 변수 이름 대신 해시 값을 사용하여 조회됩니다. 예를 들어, 다음과 같은 구조체를 사용할 때:
gml a = {this: "this", that: "that"};
다음 변수 조회는:gml b = a[$ "this"]; // 또는 b = a.this;
컴파일러는 변수 이름이 "this"임을 알고 있기 때문에 해시 값을 사용하여 조회로 대체합니다. 그러나 다음 조회는:gml var _varname = choose("this", "that"); b = a[$ _varname];
컴파일 시간에 _varname의 값이 choose 함수의 반환 값에 따라 달라지므로 대체할 수 없습니다.
위의 최적화는 구조체 함수를 호출할 때도 적용됩니다.
결정론적 함수
결정론적 함수(순수 함수라고도 함)는 상수 매개변수로 호출될 때 함수 호출의 반환 값으로 대체됩니다. 결정론적 함수는 주어진 입력에 대해 알려진 출력을 반환합니다. 예를 들어, dcos
는 결정론적입니다(즉, dcos(0)
은 항상 1을 반환하고, dcos(90)
은 항상 0을 반환함). 반면 choose
는 결정론적이지 않습니다.
템플릿 문자열
템플릿 문자열은 tostring
호출로 대체되며 위의 규칙에 따라 대체됩니다. 예를 들어, 템플릿 리터럴 문자열 $"Hello, I am {name}!"
는 내부적으로 string("Hello, I am {0}!", name)
으로 변환됩니다. 만약 name
이 문자열 리터럴(또는 문자열 리터럴에 매핑되는 매크로)이라면, 이는 완전히 최적화되어 문자열 리터럴이 됩니다.
문자열 최적화
- 포맷팅을 사용할 때 모든 상수 인자는 메인 문자열에 인라인으로 삽입되고 매개변수가 재정렬됩니다. 예를 들어:
gml string("{0} {1} {2}", "a", "=", a);
이는 다음과 같이 변환됩니다:gml string("a = {0}", a);
- 상수 문자열은 컴파일러에 의해 연결됩니다:
gml string_concat("the ", "answer ", "is ", string(a));
이는 다음과 같이 변환됩니다:gml string_concat("the answer is ", string(a));
- 상수 문자열 인자는 컴파일러에 의해 결합됩니다:
gml string_join(" ", "Hello", "World", string(a), "is", "the", "answer");
이는 다음과 같이 변환됩니다:gml string_join(" ", "Hello World", string(a), "is the answer");
컴파일러는 인자가 상수일 때만 최적화를 수행합니다.
최적화 가능한 함수 목록
다음 함수는 매개변수가 상수일 때 결정론적 함수 규칙에 따라 컴파일러에 의해 최적화됩니다:
함수 이름 |
---|
make_colour_rgb |
string_lower |
string_upper |
sin |
cos |
tan |
arcsin |
arccos |
arctan |
arctan2 |
ceil |
floor |
deg_to_rad |
rad_to_deg |
dsin |
dcos |
dtan |
arcsin |
arccos |
arctan |
arctan2 |
abs |
sign |
frac |
sqrt |
exp |
ln |
log2 |
log10 |
power |
logn |
colour_get_red |
colour_get_green |
colour_get_blue |
string_concat |
string_join |
string_min |
string_max |
string_mean |
string_median |
clamp |
lerp |
ord |
chr |
int64 |
real |
is_method |
variable_get_hash |
os_get_config |
buffer_sizeof |
gml_pragma() 사용하기
컴파일러가 게임 코드의 (일부) 컴파일 방식을 최적화할 수 있도록 "optimise" (또는 "optimize") 프래그마를 제공할 수 있습니다. 이러한 최적화는 여러 대상에 적용되거나 특정 빌드 대상에만 적용될 수 있습니다. 코드의 적절한 위치에서 이를 사용하면 게임의 성능을 크게 향상시킬 수 있습니다.
gml_pragma에 대한 전체 최적화 목록과 사용 방법은 해당 문서를 참조하세요.