GameMaker Language: 평가 순서
게임을 프로그래밍할 때, GameMaker Language(GML)를 사용할 때 이 문서를 참고하세요. 함수 호출 인자의 평가 순서가 보장되지 않기 때문에, 코드에서 함수가 실행되는 순서가 플랫폼에 따라 달라질 수 있습니다. 이는 최적화 차이로 인해 발생하는 문제입니다. 예를 들어, Windows 플랫폼에서는 함수 인자가 오른쪽에서 왼쪽으로 평가될 수 있으며, HTML5 플랫폼에서는 왼쪽에서 오른쪽으로 평가될 수 있습니다.
인자 평가 순서의 문제점
여러 함수 호출을 단일 함수 호출의 인자로 사용할 경우, 순서에 의존하게 되므로 문제를 일으킬 수 있습니다. 예를 들어, 다음과 같은 코드가 있다고 가정해 보겠습니다:
buffer_seek(buff, buffer_seek_start, 0);
buffer_get_info(buffer_read(buff, buffer_s8), buffer_read(buff, buffer_s16), buffer_read(buff, buffer_s16));
여기서 발생하는 문제는 어떤 플랫폼에서는 마지막 buffer_read()가 먼저 호출될 수 있으며, 때문에 인자가 잘못될 수 있습니다. 이렇게 되면 데이터가 "역순"으로 읽히게 되어 buffer_read() 함수의 모든 값에 영향을 주게 됩니다.
해결 방법
이런 문제를 해결하기 위해서는 명시적으로 함수를 필요한 순서로 호출하고 반환 값을 변수에 저장하는 것이 좋습니다:
var _val = array_create(3);
_val[0] = buffer_read(buff, buffer_s8);
_val[1] = buffer_read(buff, buffer_s16);
_val[2] = buffer_read(buff, buffer_s16);
buffer_get_info(_val[0], _val[1], _val[2]);
이 방법은 다소 장황해 보일 수 있지만, 모든 것을 명확하게 하고 평가 순서와 관련된 문제를 피할 수 있습니다.
표현식 사용 시 주의 사항
표현식을 사용할 때도 마찬가지로 주의가 필요합니다. 평가되는 순서가 컴파일하는 타겟에 따라 달라질 수 있으므로, 코드에서 표현식을 사용할 때는 괄호 ()를 사용하여 작업의 순서를 명확히 하는 것이 중요합니다. 이는 게임의 올바른 동작을 보장하는 데 매우 중요하며, 특히 HTML5 플랫폼에서는 필수적으로 필요합니다.
예제: 평가 순서와 표현식
코드에서 인자의 평가 순서를 명확히 관리하는 간단한 예제를 추가해 보겠습니다.
var a = 5;
var b = 10;
var result = (a + b) * 2; // 괄호를 사용하여 더하기가 먼저 수행되도록 지정
위의 예제에서는 괄호를 사용하여 더하기가 먼저 실행된 후 곱셈이 이루어지므로, 명확한 결과를 얻을 수 있습니다.
요약
| 개념 | 설명 |
|---|---|
| 평가 순서 | 함수 호출 인자의 평가 순서가 플랫폼에 따라 다름 |
| 해결 방법 | 변수를 사용하여 함수 순서를 명확히 함 |
| 표현식 주의사항 | 괄호를 사용하여 평가 순서를 명확히 설정하기 |
© Copyright YoYo Games Ltd. 2024 All Rights Reserved