네이티브 코드 생성

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

Luau의 네이티브 코드 생성 지원으로 인해 경험의 서버 사이드 스크립트는 CPU가 실행하는 기계 코드 지침으로 직접 컴파일될 수 있으며, Luau VM이 실행하는 일반 바이트코드가 아닌 것입니다.이 기능을 사용하여 서버에서 일부 스크립트의 실행 속도를 향상시킬 수 있으며, 특히 많은 수의 중량 Luau 라이브러리나 Roblox API 호출을 사용하지 않고 많은 숫자 계산을 수행하는 스크립트를 향상시킬 수 있습니다.

네이티브 코드 생성 활성화

에 대한 네이티브 코드 생성을 활성화하려면 상단에 코멘트를 추가하십시오:¹


--!네이티브
print("Hello from native code!")

이렇게 하면 스크립트의 모든 함수와 최상위 범위에 대한 네이티브 코드 생성이 가능하며, 수익성이 있다고 판단되는 경우.추가 변경 사항은 필요하지 않으며, 네이티브로 실행되는 스크립트의 동작은 이전과 동일하고 성능만 다릅니다.Luau 언어의 모든 기능과 Roblox API가 모두 지원됩니다.

또는, @native 특성을 추가하여 개별 함수에 대한 네이티브 코드 생성을 활성화할 수 있습니다:


@native
local function f(x)
return (x + 1)
end
1 미래에는 수익성이 결정되면 일부 스크립트가 자동으로 네이티브 실행을 시작할 수 있지만, 수동으로 배치된 --!native 주석이 현재 필요합니다.

모범 사례

다음 팁은 네이티브 코드 생성으로 가장 많은 이익을 얻을 수 있도록 도와줍니다:

  • Luau 내에서 많은 계산을 수행하는 스크립트 내에서 이 기능을 활성화하는 것이 가장 좋습니다.테이블과 특히 buffer 유형에 많은 수학 작업이 있는 경우 스크립트가 좋은 후보가 될 수 있습니다.

  • 스크립트의 함수만 네이티브로 컴파일됩니다.상위 외부 범위의 코드는 종종 한 번만 실행되며, 특히 모든 프레임에서 호출되는 함수보다 혜택을 적게 받습니다.

  • 스크립트나 함수가 네이티브 컴파일 없이 소요하는 시간을 측정하여 사용할 시기를 판단하는 것이 좋습니다. It's recommended that you measure the time a script or a function takes with and without native compilation to judge when it's best to use it.스크립트 프로파일러 도구는 정보에 입각한 결정을 내리기 위해 함수의 성능을 측정할 수 있습니다.

  • 일부는 더 빨리 실행되지만 네이티브 코드 생성에는 몇 가지 단점이 있습니다. 주석을 모든 스크립트에 배치하는 것이 유혹적일 수 있지만, 네이티브 코드 생성에는 몇 가지 단점이 있습니다.

    • 코드 컴파일 시간이 필요하며 이는 서버의 시작 시간을 증가시킬 수 있습니다.
    • 별도의 메모리가 네이티브로 컴파일된 코드를 저장하기 위해 사용됩니다.
    • 경험에서 네이티브 컴파일된 코드의 총 허용 금액에 제한이 있습니다.

이러한 문제는 적절한 @native 특성 사용으로 해결할 수 있습니다.

피할 코드

모든 기능이 네이티브 코드 생성을 활성화하든 비활성화하든 상관없이 동일하게 동작하지만, 일부는 네이티브로 실행되지 않고 최적화 저하 또는 해석된 실행으로 전환될 수 있습니다.이들에는 다음이 포함됩니다:

  • 사용 중단된 getfenv() / setfenv() 호출 사용.
  • Luau의 기본 제공 함수인 math.asin()와 같은 다양한 숫자가 아닌 인수를 사용하여 사용합니다.
  • 예를 들어, 잘못 타이핑된 매개변수를 타이프된 함수에 전달하여, foo(true)를 호출하면 foofunction foo(arg: string)로 선언되었을 때 를 호출합니다.항상 올바른 형식 주석을 사용하는 것을 기억하십시오.

스크립트 프로파일러를 사용하면 정규 버전의 함수와 네이티브로 컴파일된 버전 간의 시간을 비교할 수 있습니다.스크립트 내의 함수가 기본적으로 실행되지 않는 것처럼 보이면, 위의 목록에서 하나 이상의 요소가 최적화 해제를 트리거할 수 있습니다.

형식 주석 사용

네이티브 코드 생성은 코드 경로를 최적화하기 위해 지정된 변수에 대한 가장 가능성 있는 유형을 유추하려고 시도합니다.예를 들어, a + b 가 숫자에서 수행되거나 테이블이 t.X에서 액세스되는 것이 가정됩니다.그러나 연산자 오버로드로 인해 ab 는 테이블이나 Vector3 형식, 또는 t 는 Roblox 데이터 형식일 수 있습니다.

네이티브 코드 생성은 모든 입력지원하지만, 잘못된 예측은 불필요한 검사를 트리거하여 코드 실행 속도가 느려질 수 있습니다.

일부 일반적인 문제를 해결하기 위해 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 도구는 스크립트와 함수에 대해 지원됩니다.

추적 중

일반적인 스크립트 디버깅은 지원되지만, 로컬/업밸브의 뷰는 불완전하고 네이티브로 실행되는 호출 스택 프레임에서 누락된 변수가 없을 수 있습니다.

또한 네이티브 컴파일에 대해 선택된 코드를 디버깅할 때 중단점을 배치하면 해당 함수의 네이티브 실행이 비활성화됩니다.

스크립트 프로파일러

스크립트 프로파일러에서 내부적으로 실행되는 함수는 다음과 같이 옆에 표시됩니다: 스크립트 프로파일러에서 내부적으로 실행되는 함수는 다음과 같이 옆에 표시됩니다 In the Script Profiler, functions executing natively display <native> next to them:

Example of native functions flagged in the Script Profiler

함수가 표시된 경우 또는 내부의 스크립트에서 주석을 표시하지 않으면, 해당 함수는 중단점 배치, 사용 금지된 코드 사용 또는 일치하지 않는 유형 주석으로 인해 기본적으로 실행되지 않을 수 있습니다.

루오 힙

Luau 힙 프로파일러에서 네이티브 함수에 의해 사용된 메모리는 그래프에서 [native] 요소로 표시됩니다.

Example of native memory usage flagged in the Luau Heap profiler

크기 분석

모든 네이티브로 컴파일된 스크립트가 메모리를 소비합니다.컴파일된 코드의 크기가 미리 정의된 한도에 도달하면 네이티브 컴파일이 중지되고 나머지 코드가 비네이티브로 실행됩니다.이로 인해 네이티브 컴파일에 대한 스크립트 선택이 중요해집니다.

개별 함수와 스크립트의 네이티브 코드 크기를 모니터링하려면:

  1. 클라이언트/서버 전환 버튼을 통해 서버 보기에 있는지 확인하십시오.
  2. 명령줄에서 를 호출합니다.

출력 에서 네이티브로 컴파일된 스크립트와 함수의 총 수, 호출 지점까지 사용된 네이티브 코드의 메모리, 네이티브 코드 크기 제한을 확인할 수 있습니다.요약 후에는 코드 크기가 내림차순으로 정렬된 모든 네이티브 컴파일된 스크립트의 테이블을 볼 수 있습니다.

Example of native code size displayed in the Output window.

각 스크립트에 대해 출력은 컴파일된 함수 수와 네이티브 코드 메모리 사용량을 표시합니다.그런 다음 각 함수는 네이티브 코드 크기가 감소하는 순서로 나열되며, 익명 함수는 [anonymous]로 표시되고 전체 스크립트는 [top level]로 표시됩니다.최종 열에서 백분율은 네이티브 코드 크기 제한에 대해 계산됩니다.함수의 네이티브 코드 크기가 정확하게 보고되지만 스크립트의 메모리 소비는 가장 가까운 페이지 크기로 반올림됩니다.

제한 및 문제 해결

특정 CPU에 대한 코드를 지침으로 컴파일하려면 추가 저장 메모리가 필요합니다.또한 복잡한 함수에 대한 최적화는 수행하는 데 너무 많은 시간이 걸릴 수 있습니다.내부 한계에 도달하면 Studio의 출력 창에 오류가 보고되며 다음이 포함됩니다.

라인 20에서 함수 'f'가 단일 코드 블록 명령 제한을 초과했습니다.

이 오류는 함수 내의 단일 코드 블록이 64K 명령 이상을 사용했음을 의미합니다.함수를 단순화하거나 개별 작은 함수로 분할하여 이를 피할 수 있습니다.

라인 20에서 함수 'f'가 함수 코드 블록 제한을 초과했습니다.

이 오류는 단일 함수에 32K 이상의 코드 내부 블록이 포함되어 있음을 의미합니다.코드의 내부 블록은 스크립트의 제어 흐름 블록과 정확히 매핑되지 않지만, 함수에서 제어 흐름을 단순화하거나 개별 작은 함수로 분할하여 이 오류를 피할 수 있습니다.

라인 200에서 함수 'f'가 전체 모듈 명령 제한을 초과했습니다.

이 오류는 전체 스크립트에 대한 100만 개 명령의 한계에 도달했다는 것을 의미합니다.경우에 따라 보고된 함수 자체에 많은 지침이 있거나 스크립트의 이전 함수에 한계가 도달했을 수 있습니다.이 문제를 피하려면 특히 큰 함수를 별도의 비네이티브가 아닌 스크립트로 이동하거나 다른 함수에 @native를 사용하는 것이 좋습니다.또한 --!native 로 별도의 스크립트를 표시하려고 시도할 수도 있지만, 100만 개의 명령은 많은 메모리를 사용하고 메모리 제한을 초과할 수 있습니다.

*라인 20에서 함수 'f'가 내부 낮추기 오류를 발견했습니다 *(또는) 내부 오류: 네이티브 코드 생성 실패(어셈블리 낮추기)

때때로 함수에는 네이티브 코드 컴파일러가 현재 처리할 수 없는 복잡한 코드 조각이 포함되어 있습니다.이 오류를 방지하려면 코드에서 복잡한 식을 검사하고 분할하거나 단순화하거나, 이 이유로 실패한 코드의 예제로 버그 보고서를 열도록 고려하십시오.

네이티브 코드 생성에 대한 메모리 할당 한도 도달

이 오류는 네이티브 코드 데이터의 전체 메모리 제한에 도달했음을 의미합니다.이를 피하려면 더 많은 메모리를 사용하는 스크립트에서 --!native 를 제거하여 더 작은 스크립트를 한도 아래에 맞출 수 있도록 합니다.대신, 큰 또는 자주 호출되지 않는 함수를 별도의 비네이티브 모듈로 이동합니다.