Luau 네이티브 코드 생성 지원으로 경험의 서버 사이드 스크립트는 일반적인 바이트코드가 아닌 컴퓨터 사이드 스크립트를 직접 머신 코드 지침으로 컴파일할 수 있습니다. 이 기능은 서버에서 일부 스크립트의 실행 속도를 향상시킬 수 있습니다
네이티브 활성화
Class.Script에 대해 네이티브 코드 생성을 활성화하려면 위의 코멘트 줄에 --!native 을 추가하십시오.
--!네이티브print("Hello from native code!")
이렇게 하면 스크립트의 모든 함수에 대해 네이티브 코드 생성이 가능하며, 최상위 수준의 범위, 유용하다고 판단되는 경우에만 범위가 확장됩니다. 추가 변경 사항은 필요 없습니다. 네이티브 스크립트 실행 기능은 이전과 동일하며 성능만 다릅니다. Luau 언어 및 Roblox API의 모든 기능이 지
또한, @native 특성을 추가하여 개별 함수에 대해 네이티브 코드 생성을 활성화할 수 있습니다.
@native
local function f(x)
return (x + 1)
end
모범 사례
다음 팁을 따라 네이티브 코드 생성으로 가장 많이 이익을 얻을 수 있습니다.
Luau 내에서 많은 계산을 직접 수행하는 스크립트에서 이 기능을 활성화하는 것이 좋습니다. 테이블에 대한 수학 연산이 많이 있고 특히 buffer 형식의 경우 스크립트가 좋은 후보가 될 수 있습니다.
스크립트의 함수 만 네이티브로 컴파일됩니다. 상위 외부 범위 의 코드는 종종 한 번만 실행되고 여러 번 호출되는 함수는 혜택을 덜 받지 않습니다. 특히 프레임마다 호출되는 함수의 경우 더 많이 호출되는 경우에 특히 그렇습니다.
스크립트나 함수의 컴파일 시간을 측정하면 네이티브 컴파일이 있는 경우와 없는 경우 어느 때가 가장 좋은지 결정할 수 있습니다. 스크립트 프로파일러 도구는 성능을 측정하여 정보에 입각한 결정을 내릴 수 있습니다.
일부는 더 빠르게 실행되기 때문에 모든 스크립트에 --!native 코멘트를 배치하는 것이 좋지만, 네이티브 코드 생성은 몇 가지 단점이 있습니다.
- 서버의 시작 시간을 늘릴 수 있는 코드 컴파일 시간이 필요합니다.
- 추가 메모리는 컴파일된 코드를 저장하는 데 사용됩니다.
- 경험에서 허용되는 총 코드 양에 제한이 있습니다.
이러한 문제는 @native 특성을 현명하게 사용하여 해결할 수 있습니다.
피하기 위한 코드
모든 기능은 네이티브 코드 생성이 활성화되었는지 여부에 관계없이 동일하게 작동하지만, 일부는 실행하지 못하고 다른 작업을 수행할 수 있습니다. 여기에는 다음이 포함됩니다.
- Library.math.asin()과 같은 다양한 내장 함수를 사용하지 않은 숫자 인수로 사용하는 경우.
- 잘못 된 값을 입력한 매개 변수를 입력 함수로 전달하는 경우, 예를 들어 foo(true) 를 호출하면 foo 가 function foo(arg: string) 로 선언된 경우. 항상 올바른 2> 형식 지정자2> 를 사용하십시오.
스크립트 프로파일러를 사용하면 기본적으로 컴파일된 버전과 함수의 시간을 비교할 수 있습니다. 내부 스크립트 또는 표시된 위치 네이티브에서 실행되는 것으로 보이지 않는 경우 스크립트 프로파일러에서 하
형식 지정자 사용
네이티브 코드 생성은 코드 경로를 최적화하기 위해 지정된 변수에 대해 가장 가능성이 높은 유형을 추측하려고 시도합니다. 예를 들어
네이티브 코드 생성은 모든 입력지원하지만, 잘못된 예측은 필요 없는 검사를 트리거하여 코드 실행을 더 느리게 할 수 있습니다.
일부 일반적인 문제를 해결하기 위해 Luau는 함수 인수에 대한 주석을 확인하지만, Vector3 인수에 대한 주석을 특히 권장합니다.
--!네이티브
-- “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
Studio 도구
다음 Studio 도구는 --!native 스크립트 및 #number 함수를 지원합니다.
디버깅
스크립트의 일반적인 디버깅을 지원하지만, 로컬/업밸 용 스크립트 보기는 네이티브로 실행되는 콜 스택 프레임에서 불완전하거나 누락된 변수일 수 있습니다.
또한 네이티브 컴파일에 대해 선택한 코드를 디버깅할 때 중단점을 배치하면 해당 함수에 대한 네이티브 실행을 비활성화합니다.
스크립트 프로필러
In the 스크립트 프로필러 , 함수를 실행하는 네이티브 디스플레이 <native> 함께 표시합니다.
native 또는 --!native 안에 있는 스크립트에 표시되지 않는 경우, 해당 함수는 중단점 배치 때문에 자연스럽게 실행되지 않을 수 있습니다. 1>disencouraged code1> 또는 <
Luau 힙
In the Luau Heap profiler, memory taken by native functions displays as [native] elements in the graph.
크기 분석
모든 네이티브 컴파일된 스크립트는 메모리를 소모합니다. 컴파일된 코드의 크기가 미리 정의된 한도에 도달하면 네이티브 컴파일이 중지되고 남은 코드는 실행되지 않습니다. 이렇게 하면 네이티브 컴파일을 위해 스크립트를 신중하게 선택할 필요가 있습니다.
개별 함수 및 스크립트의 네이티브 코드 크기를 모니터링하려면:
- 클라이언트/서버 토글 버튼을 통해 서버 보기 서버 보기를 확인하세요.
- Command Bar에서 debug.dumpcodesize()를 호출합니다.
출력 창에서 스크립트 및 함수의 총 수를 확인하고, 메모리 사용량을 나타내는 내가 네이티브 코드에 컴파일된 스크립트 및 함수의 크기 한도를 보고, 내 코드 버전에 대한 내 코드 버전 정보를 확인합니다. 요약을 따라 코드 크기 순으로 내가 컴파일한 모든 스크립트를
각 스크립트에서 출력은 컴파일된 함수 수와 네이티브 코드 메모리 사용량을 표시합니다. 각 함수는 다음과 같은 순서로 기본 코드 크기에 대해 나열됩니다.각 함수는 익명 함수로 표시되며 전체 스크립트는 익명
제한 및 문제 해결
특정 CPU에 대한 코드를 명령으로 컴파일하려면 추가 저장 메모리가 필요합니다. 또한 복잡한 함수에 대한 최적화는 성능이 너무 느릴 수 있습니다. 내부 제한을 명시적으로 지정하면 Studio의 출력 창에 오류가 보고됩니다. 여기에는 다음이 포함됩니다.
20번째 줄의 'f' 함수가 단일 코드 블록 지침 한도를 초과했습니다.
이 오류는 함수 내의 단일 코드 블록이 64K 명령을 초과하는 경우가 있음을 나타냅니다. 이를 방지하려면 함수를 단순화하거나 개별 작은 함수로 분할할 수 있습니다.
라인 20에서 함수 'f' 블록 크기 초과
이 오류는 단일 함수에 32K 이상의 내부 코드 블록이 포함되어 있음을 의미합니다. 내부 코드 블록은 스크립트의 컨트롤 흐름 블록에 정확히 매핑되지 않지만 이 오류를 피하려면 함수를 단순화하거나 개별 작은 함수로 분할할 수 있습니다.
라인 200에서 함수 'f'가 총 모듈 지시 한도를 초과했습니다.
이 오류는 함수가 전체 스크립트에 대해 10만 명의 명령을 초과했다는 것을 의미합니다. 일부 경우 보고된 함수 자체에 많은 명령이 있거나 한 번에 여러
*라인 20에서 기능 'f'에 내부 하향 오류 발생 *(또는) 내부 오류: 기본 코드 생성 실패(Assembly 하향)
때로는 네이티브 코드 컴파일러가 현재 처리할 수 없는 복잡한 코드 조각을 함수에 포함하고 있습니다. 이 오류를 피하려면 코드 내의 복잡한 식을 검토하고 예를 들어 버그 보고서를 열거나 간단화하지만, 이 경우에도 코드 실행 오류가 발생한 이유에 대한 버그 보고서를 열 수 있습니다.
네이티브 코드 생성에 대한 메모리 할당 한도 초과
이 오류는 네이티브 코드 데이터의 전체 메모리 한도에 도달했음을 의미합니다. 이를 피하려면 더 작은 스크립트를 더 많이 수용할 수 있도록 메모리가 더 효율적인 스크립트에서 --!native 을 제거하십시오. 또는 큰 메모리 또는 자주 호출되지 않는 함