Luau의 네이티브 코드 생성 지원을 통해 게임의 서버 측 스크립트는 Luau VM이 작동하는 일반 바이트코드가 아닌 CPU가 실행하는 기계 코드 명령어로 직접 컴파일될 수 있습니다. 이 기능은 특히 많은 수치 계산을 수행하지만 너무 많은 무거운 Luau 라이브러리나 Roblox API 호출을 사용하지 않는 스크립트의 실행 속도를 개선하는 데 사용할 수 있습니다.
네이티브 코드 생성 활성화
Script에 대한 네이티브 코드 생성을 활성화하려면, 맨 위에 --!native 주석을 추가하세요:¹
--!native
print("네이티브 코드에서 인사합니다!")이렇게 하면 스크립트의 모든 함수와 수익성이 있다고 판단되는 최상위 범위에 대해 네이티브 코드 생성이 활성화됩니다. 추가적인 변경은 필요하지 않으며, 네이티브로 실행되는 스크립트의 동작은 이전과 정확히 동일하고 성능만 다릅니다. Luau 언어의 모든 기능과 모든 Roblox API는 여전히 지원됩니다.
또는 @native 속성을 추가하여 개별 함수에 대해 네이티브 코드 생성을 활성화할 수 있습니다:
@native
local function f(x)
return (x + 1)
end모범 사례
다음 팁은 네이티브 코드 생성의 이점을 최대한 활용하는 데 도움이 됩니다:
이 기능은 Luau 내에서 많은 계산을 수행하는 스크립트 내에서 활성화하는 것이 가장 좋습니다. 테이블에 대한 많은 수학적 연산이 있는 경우, 특히 buffer 유형이 있는 경우, 해당 스크립트는 좋은 후보가 될 수 있습니다.
네이티브 컴파일이 있는 경우와 없는 경우 스크립트나 함수가 소요하는 시간을 측정하여 언제 사용하는 것이 가장 좋은지 판단하는 것이 좋습니다. 스크립트 프로파일러 도구는 정보를 바탕으로 결정을 내리기 위해 함수의 성능을 측정할 수 있습니다.
모든 스크립트에 --!native 주석을 배치하여 일부가 더 빠르게 실행될 수 있도록 하는 것은 유혹적일 수 있지만, 네이티브 코드 생성에는 몇 가지 단점이 있습니다:
- 코드 컴파일 시간이 필요하여 서버의 시작 시간이 증가할 수 있습니다.
- 네이티브로 컴파일된 코드를 저장하기 위해 추가 메모리가 필요합니다.
- 게임에서 허용되는 네이티브로 컴파일된 코드의 총량에 제한이 있습니다.
이러한 문제는 @native 속성을 신중하게 사용하여 해결할 수 있습니다.
피해야 할 코드
모든 기능은 네이티브 코드 생성이 활성화되었든 아니든 동일하게 작동하지만, 일부는 네이티브로 실행되지 않으며 비최적화 또는 해석된 실행으로 되돌아갈 수 있습니다. 여기에는 다음이 포함됩니다:
- 비수치 인수를 가진 다양한 Luau 내장 함수 사용, 예: math.asin().
- 잘못된 유형의 매개변수를 유형이 지정된 함수에 전달하는 것, 예: function foo(arg: string)로 선언된 foo를 호출할 때 foo(true)를 호출하는 경우. 항상 올바른 유형 주석을 사용하는 것을 기억하세요.
스크립트 프로파일러를 사용할 때, 일반 버전의 함수와 네이티브로 컴파일된 함수가 소요하는 시간을 비교할 수 있습니다. --!native 스크립트 내의 함수나 @native로 표시된 함수가 네이티브로 실행되지 않는 것처럼 보인다면, 위 목록의 하나 이상의 요인이 비최적화를 유발할 수 있습니다.
유형 주석 사용
네이티브 코드 생성은 주어진 변수에 대해 가장 가능성이 높은 유형을 추론하여 코드 경로를 최적화하려고 합니다. 예를 들어, a + b는 숫자에서 수행된다고 가정하거나, t.X에서 테이블에 접근한다고 가정합니다. 그러나 연산자 오버로드로 인해 a와 b는 테이블이나 Vector3 유형일 수 있으며, t는 Roblox 데이터 유형일 수 있습니다.
네이티브 코드 생성은 모든 유형을 지원하지만, 잘못된 예측은 불필요한 검사를 유발하여 코드 실행 속도를 느리게 할 수 있습니다.
일부 일반적인 문제를 해결하기 위해, 함수 인수에 대한 Luau 유형 주석이 확인되지만, 특히 Vector3 인수를 주석 처리하는 것이 권장됩니다:
--!native
-- "v"는 테이블로 가정됩니다; 테이블 검사를 수행하여 함수가 느리게 실행됩니다
local function sumComponentsSlow(v)
return v.X + v.Y + v.Z
end
-- "v"는 Vector3로 선언됩니다; 벡터에 특화된 코드가 생성됩니다
local function sumComponentsFast(v: Vector3)
return v.X + v.Y + v.Z
end스튜디오 도구
다음 스튜디오 도구는 --!native 스크립트 및 @native 함수에 대해 지원됩니다.
디버깅
스크립트의 일반 디버깅이 지원되지만, 로컬/업밸류에 대한 뷰는 불완전할 수 있으며 네이티브로 실행되는 호출 스택 프레임에서 변수가 누락될 수 있습니다.
또한 네이티브 컴파일을 위해 선택된 코드를 디버깅할 때, 중단점을 배치하면 해당 함수에 대한 네이티브 실행이 비활성화됩니다.
스크립트 프로파일러
스크립트 프로파일러에서 네이티브로 실행되는 함수는 옆에 <native>가 표시됩니다:

@native로 표시된 함수나 --!native 스크립트 내의 함수가 <native> 주석을 표시하지 않으면, 해당 함수는 중단점 배치, 피해야 할 코드 사용 또는 불일치하는 유형 주석으로 인해 네이티브로 실행되지 않을 수 있습니다.
Luau 힙
Luau 힙 프로파일러에서 네이티브 함수가 차지하는 메모리는 그래프에서 [native] 요소로 표시됩니다.

크기 분석
모든 네이티브로 컴파일된 스크립트는 메모리를 소비합니다. 컴파일된 코드의 크기가 미리 정의된 한도에 도달하면 네이티브 컴파일이 중지되고 나머지 코드는 비네이티브로 실행됩니다. 따라서 네이티브 컴파일을 위해 스크립트를 신중하게 선택하는 것이 필수적입니다.
개별 함수 및 스크립트의 네이티브 코드 크기를 모니터링하려면:
- 클라이언트/서버 전환 버튼을 통해 서버 뷰에 있는지 확인합니다.
- 명령 바에서 debug.dumpcodesize()를 호출합니다.
출력 창에서 호출 시점까지 네이티브로 컴파일된 스크립트와 함수의 총 수, 네이티브 코드로 소비된 메모리 및 네이티브 코드 크기 한도를 확인할 수 있습니다. 요약 후, 코드 크기 내림차순으로 모든 네이티브로 컴파일된 스크립트에 대한 표가 표시됩니다.

각 스크립트에 대해 출력은 컴파일된 함수의 수와 네이티브 코드 메모리 소비를 표시합니다. 그런 다음 각 함수는 네이티브 코드 크기 내림차순으로 나열되며, 익명 함수는 [anonymous]로 표시되고 전체 스크립트는 [top level]로 표시됩니다. 마지막 열에서는 네이티브 코드 크기 한도에 대한 비율이 계산됩니다. 함수의 네이티브 코드 크기는 정확하게 보고되지만, 스크립트의 메모리 소비는 가장 가까운 페이지 크기로 반올림됩니다.
한계 및 문제 해결
특정 CPU에 대한 명령어로 코드를 컴파일하려면 추가 저장 메모리가 필요합니다. 또한 복잡한 함수에 대한 최적화는 수행하는 데 너무 많은 시간이 걸릴 수 있습니다. 내부 한도에 도달하면 스튜디오의 출력 창에 오류가 보고됩니다. 오류 메시지는 다음과 같습니다:
함수 'f'가 20번째 줄에서 단일 코드 블록 명령어 한도를 초과했습니다.
이 오류는 함수 내의 단일 코드 블록이 64K 명령어를 초과했음을 의미합니다. 이는 함수를 단순화하거나 개별적으로 더 작은 함수로 나누어 피할 수 있습니다.
함수 'f'가 20번째 줄에서 함수 코드 블록 한도를 초과했습니다.
이 오류는 단일 함수가 32K 이상의 내부 코드 블록을 포함하고 있음을 의미합니다. 내부 코드 블록은 스크립트의 제어 흐름 블록과 정확히 일치하지 않지만, 이 오류는 함수의 제어 흐름을 단순화하거나 개별적으로 더 작은 함수로 나누어 피할 수 있습니다.
함수 'f'가 200번째 줄에서 전체 모듈 명령어 한도를 초과했습니다.
이 오류는 전체 스크립트에 대해 함수가 100만 개의 명령어 한도에 도달했음을 의미합니다. 경우에 따라 보고된 함수 자체가 많은 명령어를 포함하고 있거나, 스크립트의 이전 함수들에 의해 한도가 도달했을 수 있습니다. 이 문제를 피하려면, 특히 큰 함수를 별도의 비네이티브 스크립트로 이동하거나 다른 함수에 @native를 사용하는 것이 좋습니다. 해당 별도의 스크립트에 --!native를 표시해 볼 수도 있지만, 100만 개의 명령어는 많은 메모리를 차지하므로 메모리 한도를 초과할 수 있습니다.
함수 'f'가 20번째 줄에서 내부 하강 실패를 만났습니다. (또는)
내부 오류: 네이티브 코드 생성 실패 (어셈블리 하강)
때때로 함수에 네이티브 코드 컴파일러가 현재 처리할 수 없는 복잡한 코드 조각이 포함될 수 있습니다. 이 오류를 피하려면 코드의 복잡한 표현식을 검사하고 이를 나누거나 단순화하되, 이로 인해 실패한 코드의 예와 함께 버그 보고서를 제출하는 것도 고려하세요.
네이티브 코드 생성을 위한 메모리 할당 한도에 도달했습니다.
이 오류는 네이티브 코드 데이터에 대한 전체 메모리 한도에 도달했음을 의미합니다. 이를 피하려면, 더 많은 메모리를 사용하는 스크립트에서 --!native를 제거하여 더 작은 스크립트가 한도 내에 들어갈 수 있도록 하세요. 또는 큰 함수나 자주 호출되지 않는 함수를 별도의 비네이티브 모듈로 이동하세요.