ネイティブコード生成

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

Luau サポートにより、エクスペリエンス内のサーバー側スクリプトは、ルールベースコードの生成に対して、CPUs が実行するルールベースコードの指示に直接コンパイルされるため、サーバー側のスクリプトがルールベースコードの実行速度を向上させることができます。この機能は、特に Luau VM のコアコード

ネイティブを有効化中

Class.Script のネイティブコード生成を有効にするには、トップに --!native を追加します。


--!ネイティブ
print("Hello from native code!")

これにより、スクリプト内のすべての機能のためのネイティブコード生成が可能になり、上位レベルのスコープ(有益である場合)が可能になります。これにより、追加の変更は必要ありません。 Luau 言語およびすべての Roblox API の機能は、すべてと同じように動作します。

あるいは、native 属性を追加して、個々の関数についてネイティブコード生成を有効にすることもできます。


@native
local function f(x)
return (x + 1)
end
1 未来、いくつかのスクリプトは、有益であることが判明した場合、自動的に実行されるかもしれませんが、手動で配置された --!native コメントは現在、必要です。

ベストプラクティス

次のヒントは、ネイティブコード生成で最大限に利益を得る方法を示しています:

  • Luau 内で実行するたくさんの計算を直接実行するスクリプト内でこの機能を有効にすることが最善策です。如果表にある特に buffer タイプの多くの数学操作がある場合、スクリプトが良い候補になる可能性があります。

  • スクリプトの 機能 だけがネイティブでコンパイルされます。上の外部の スコープ にあるコードは、多くの回呼び出される関数を実行するためにしばしば実行されます。特に、毎フレーム で呼び出される関数は、多くの回呼び出される関数を実行するためにしばしば実行されます。

  • スクリプトまたは関数のネイティブコンパイルなしでの時間を測定することをお勧めします。スクリプトプロファイラー ツールは、パフォーマンスのモニタリングを行い、最適なタイミングで使用することを決定するために機能を測定できます。

  • --!native コメントをすべてのスクリプトの すべて に配置することは誘惑かもしれませんが、ネイティブコード生成にはいくつかのデメリットがあります:

    • サーバーの起動時間を延長できるコードコンパイル時間が必要です。
    • 追加のメモリは、ネイティブにコンパイルされたコードを保存するために占用されます。
    • エクスペリエンスでは、ネイティブにコンパイルされたコードの合計量に制限があります。

これらの問題は、@native 属性を賢く使用することで解決できます。

回避するコード

すべての機能は、ネイティブコード生成を有効にしたまたはしなかったにかかわらず、同じように動作しますが、一部は実行できません、または落ちる可能性があり、データの捕縮またはデフォルトの実行につながる可能性があります。これには以下が含まれます:

  • 使用中は getfenv() / setfenv() 呼び出しです。
  • 非数値引数で math.asin() のような Luau 内蔵関数を使用している。
  • 不適切に入力されたパラメータを型付けられた関数にパスするなど、不正なパラメータを型付けられた関数にパスすること、例えば foo(true) を呼び出すときに foofunction foo(arg: string) として宣言されていることを常に覚えておく必要があります。忘れないでください。

スクリプトプロファイラー を使用すると、機能の正常なバージョン と スクリプトをコンパイルされたバージョン の時間を比較することができます。1>スクリプトプロファイラー1> 内の関数、またはマークドの 4>

タイプアノートを使用する

ネイティブコード生成は、コードのパスを最適化するために、指定された変数の最も可能性のあるタイプを推定しようとします。たとえば、 a + b

ネイティブコード生成は任入力のタイプをサポートしますが、予測は必要ないチェックをトリガーし、結果としてコードの実行が遅くなります。

一般的な問題を解決するために、Luau は機能引数にアノーティングをチェックしますが、Vector3 引数にアノーティングすることをお勧めします:


--!ネイティブ
-- 「v」はテーブルとなります。テーブルチェックにより、機能が遅くなります
local function sumComponentsSlow(v)
return v.X + v.Y + v.Z
end
-- 「v」はベクトルであることが宣言されました;ベクトルのコードは生成されます
local function sumComponentsFast(v: Vector3)
return v.X + v.Y + v.Z
end

Studio ツーリング

次の Studio ツールは、--!native スクリプトと@native 関数のためにサポートされています。

デバッグ

スクリプトのデバッグはサポートされていますが、ローカル/upvalues のビューは、コールスタック フレームで実行されている NAT のビューか、実行されているローカル/upvalues のビューか、実行されているローカル/upvalues のビューの 1つかもしれません。

また、ブレークポイント を配置すると、コードのデバッグ用に選択されているコードの実行を無効にすることに注意してください。

スクリプトプロファイラー

In the スクリプトプロフィーラー , functions executing natively display <native> 次の彼らの隣に:

Example of native functions flagged in the Script Profiler

#number1 または #number1 内の関数は、--!native 以外のスクリプト内の関数を表示しません。1> 2> --!nat

Luau ヒープ

In the Luau Heap profiler, memory taken by native functions displays as [native] 要素 in the graph.

Example of native memory usage flagged in the Luau Heap profiler

サイズ分析

すべてのネイティブにコンパイルされたスクリプトはメモリを消費します。コンパイルされたコードのサイズがプレディファインドの制限に達したとき、ネイティブコンパイルは中断され、残りのコードは実行されません。これにより、ネイティブコンパイルのためにスクリプトを慎重に選択する必要があります。

個々の関数とスクリプトのネイティブコードサイズを監視するには:

  1. Make sure you're in サーバー ビューを通じて クライアント/サーバートグルール ボタンで。
  2. コマンドバーから debug.dumpcodesize() を呼び出します。

出力 ウィンドウに、スクリプトと関数の合計数が、コールポイントによって使用されるメモリのサイズ制限、および、コールポイントのオリジナルコードサイズ制限を表示します。まとめ要の後、コールポイントのすべてのスクリプトのサイズが、1>スクリプト1>のサイズの4>倍

Example of native code size displayed in the Output window.

各スクリプトの出力には、コンパイルされた機能の数とネイティブコードのメモリ使用量が表示されます。各機能は、[anonymous] という名前の無名な関数を持ち、スクリプトのメモリ使用量は[top level] で表示されます。最終列には

制限とトラブルシューティング

特定の CPU のコードを指示に変換するには、追加のストレージメモリが必要です。さらに、複雑な関数の最適化には、実行時間が長すぎる可能性があります。内部制限にヒットすると、Studio の 出力 ウィンドウにエラーが報告され、次のことが含まれます:

20行目の「f」機能は、単一コードブロックの指示限度を超えました

このエラーは、関数内の 1つのコードブロックが 64K 以上のインストラクションを使用していることを意味します。これを避けるには、関数を単純化するか、個々の小さな関数に分割することができます。

ライン 20 の「f」機能は、機能コードブロックの上限を超えました

このエラーは、1つの関数に32K以上の内部コードブロックが含まれていることを意味します。内部コードブロックは、スクリプトのコントロールフローブロックに正確にマップしませんが、このエラーを避けるためには、関数を単純化したり、個々の小さな関数に分割したりすることができます。

ライン 200 の「f」機能は、合計モジュール指示限を超えました

このエラーは、合計でスクリプトの 100万個の指示に到達したという意味です。この場合、報告された関数自体には多くの指示があるか、スクリプトの開始時に --!native</

*行 20 の「f」機能は、内部の下降失敗に遭遇しました *(または) 内部エラー: コード生成失敗 (アセンブル下降)

場合には、ネイティブコードコンパイラーが現在処理できない複雑なコードのビットが関数に含まれています。このエラーを避けるには、コードの複雑なエクスプレッションを調べ、複雑なエクスプレッションを分割または単純化し、また、このエラーについてのバグ報告を開くことを検討してください。

ネイティブコード生成のメモリー割り当て限度に達しました

このエラーは、ネイティブコードデータの全体メモリー制限に達したことを意味します。これを避けるには、よりメモリーが使用されているスクリプトから --!native を削除し、より小さなスクリプトを容量の上限の下に満たすことができます。また、大きなまたは不要な関数を別の非ネイティブモジュ