Pembuatan kode asli

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Dengan dukungan Luau untuk pembuatan kode asli, skrip sisi server dalam pengalaman Anda dapat dikompilasi langsung ke instruksi kode mesin yang dieksekusi oleh CPU, bukan bytecode biasa yang dijalankan oleh VM Luau.Fitur ini dapat digunakan untuk meningkatkan kecepatan eksekusi untuk beberapa skrip di server, khususnya yang memiliki banyak perhitungan numerik tanpa menggunakan terlalu banyak panggilan perpustakaan Luau atau API Roblox.

Aktifkan pembuatan kode asli

Untuk mengaktifkan pembuatan kode asli untuk Script , tambahkan komentar --!native di bagian atas:¹


--!native
print("Hello from native code!")

Ini memungkinkan pembuatan kode asli untuk semua fungsi dalam skrip, dan lingkup tingkat atas, jika dianggap menguntungkan.Tidak diperlukan perubahan tambahan; perilaku skrip yang dieksekusi secara native persis sama dengan sebelumnya dan hanya kinerja yang berbeda.Semua fitur bahasa Luau dan semua API Roblox tetap didukung.

Alternatifnya, Anda dapat mengaktifkan pembuatan kode asli untuk fungsi individu dengan menambahkan atribut @native:


@native
local function f(x)
return (x + 1)
end
1 Di masa depan, beberapa skrip mungkin secara otomatis mulai berjalan secara native jika ditentukan untuk menjadi menguntungkan, tetapi komentar yang ditempatkan secara manual saat ini diperlukan.

Praktik terbaik

Tip berikut akan membantu Anda mendapatkan keuntungan paling dari pembuatan kode asli:

  • Yang terbaik adalah mengaktifkan fitur ini di dalam skrip yang melakukan banyak komputasi langsung di Luau.Jika Anda memiliki banyak operasi matematika pada tabel dan terutama tipe buffer, skrip mungkin menjadi kandidat yang baik.

  • Hanya fungsi skrip yang dikompilasi secara native.Kode di luar teratas bidang sering dieksekusi hanya sekali dan tidak mendapat manfaat sebanyak fungsi yang dipanggil berkali-kali, terutama yang dipanggil setiap frame.

  • Disarankan agar Anda mengukur waktu yang dibutuhkan oleh skrip atau fungsi dengan dan tanpa kompilasi asli untuk menilai kapan waktunya terbaik untuk menggunakannya.Alat Profil Skrip dapat mengukur kinerja fungsi untuk membuat keputusan yang tepat.

  • Mungkin tergoda untuk menempatkan komentar --!native di setiap skrip hanya jika beberapa dari mereka akan dieksekusi lebih cepat, tetapi pembuatan kode asli memiliki beberapa kekurangan:

    • Waktu kompilasi kode diperlukan yang dapat meningkatkan waktu startup server.
    • Memori ekstra ditempati untuk menyimpan kode yang dikompilasi secara native.
    • Ada batasan pada jumlah kode yang dikompilasi secara native maksimum yang diizinkan dalam pengalaman.

Masalah-masalah ini dapat ditangani dengan penggunaan bijaksana dari atribut @native.

Kode untuk dihindari

Sementara semua fitur akan berperilaku sama dengan atau tanpa pembuatan kode asli diaktifkan, beberapa dari mereka tidak akan dijalankan secara native dan mungkin menyebabkan de‑optimalisasi atau kembalian ke eksekusi yang diinterpretasikan.Ini termasuk:

  • Penggunaan deprecated getfenv() / setfenv() panggilan.
  • Penggunaan berbagai fungsi bawaan Luau seperti math.asin() dengan argumen non-numerik.
  • Melewati parameter yang ditulis tidak benar ke fungsi ditulis, misalnya memanggil foo(true) ketika foo dideklarasikan sebagai function foo(arg: string) .Ingatlah selalu untuk menggunakan anotasi jenis yang benar .

Saat menggunakan Profil Skrip, Anda dapat membandingkan waktu yang diambil oleh versi reguler fungsi versus yang dikompilasi secara native.Jika fungsi di dalam --!native skrip atau ditandai dengan @native tidak tampak dieksekusi secara native, satu atau lebih faktor dari daftar di atas dapat menyebabkan de-optimalisasi.

Gunakan anotasi jenis

Upaya pembuatan kode asli mencoba untuk menyimpulkan jenis paling mungkin untuk variabel tertentu untuk mengoptimalkan jalur kode.Sebagai contoh, diasumsikan bahwa a + b dilakukan pada angka, atau bahwa tabel diakses di t.X .Namun, karena overload operator, a dan b mungkin adalah tabel atau Vector3 jenis, atau t mungkin adalah jenis datipe Roblox.

Sementara pembuatan kode asli akan mendukung semua ketik, kesalahan prediksi dapat memicu pemeriksaan yang tidak perlu, yang menyebabkan eksekusi kode lebih lambat.

Untuk memecahkan beberapa masalah umum, Luau mengetik anotasi pada argumen fungsi diperiksa, tetapi sangat disarankan untuk menandai argumen Vector3:


--!native
-- dianggap bahwa "v" adalah tabel; fungsi berjalan lebih lambat karena pemeriksaan tabel
local function sumComponentsSlow(v)
return v.X + v.Y + v.Z
end
-- “v” dideklarasikan sebagai Vector3; kode khusus untuk vektor dibuat
local function sumComponentsFast(v: Vector3)
return v.X + v.Y + v.Z
end

Peralatan studio

Alat pengembangan Studio berikut didukung untuk --!native skrip dan @native fungsi.

Depurasi

Pemecahan masalah umum dari skrip didukung, tetapi pandangan untuk lokal/upvalues mungkin tidak lengkap dan kehilangan variabel dari tumpukan panggilan yang dieksekusi secara native.

Perhatikan juga bahwa saat mendepur kode yang dipilih untuk kompilasi asli, menempatkan titik istirahat akan menonaktifkan eksekusi asli untuk fungsi tersebut.

Pencari Profil Skrip

Di dalam Profil Skrip, fungsi yang dieksekusi secara native menampilkan <native> di samping mereka:

Example of native functions flagged in the Script Profiler

Jika fungsi ditandai @native atau di dalam skrip --!native tidak menunjukkan anotasi <native> , fungsi itu mungkin tidak dieksekusi secara native karena penempatan titik pemecah , penggunaan kode dikesampingkan , atau anotasi tipe yang tidak cocok .

Tumpukan Luau

Di profiler heap Luau , memori yang diambil oleh fungsi asli ditampilkan sebagai elemen [native] di grafik.

Example of native memory usage flagged in the Luau Heap profiler

Analisis ukuran

Setiap skrip yang dikompilasi secara native mengkonsumsi memori.Ketika ukuran kode yang dikompilasi mencapai batas yang telah ditentukan, kompilasi asli berhenti dan kode yang tersisa dijalankan tanpa kompilasi asli.Ini membuat penting untuk memilih skrip dengan hati-hati untuk kompilasi asli.

Untuk memantau ukuran kode asli fungsi dan skrip individu:

  1. Pastikan Anda berada di Server pandangan melalui tombol client/server toggle.
  2. Memanggil debug.dumpcodesize() dari Bilah Perintah.

Di jendela Output, Anda akan melihat jumlah total skrip dan fungsi yang telah dikompilasi secara native hingga titik panggilan, memori yang dikonsumsi oleh kode asli mereka, dan batas ukuran kode asli.Setelah ringkasan, Anda akan melihat tabel untuk setiap skrip yang dikompilasi secara native dalam urutan kode ukuran menurun.

Example of native code size displayed in the Output window.

Untuk setiap skrip, output menampilkan jumlah fungsi yang dikompilasi dan konsumsi memori kode asli.Setiap fungsi kemudian terdaftar dalam urutan menurun ukuran kode asli, dengan fungsi anonim ditampilkan sebagai [anonymous] dan seluruh skrip ditampilkan sebagai [top level] .Di kolom terakhir, persentase dihitung dengan mempertimbangkan batas ukuran kode asli.Perhatikan bahwa ukuran kode asli fungsi dilaporkan dengan tepat tetapi konsumsi memori untuk skrip dibulatkan ke ukuran halaman terdekat.

Batasan dan troubleshooting

Mengkompilasi kode menjadi instruksi untuk CPU tertentu membutuhkan memori penyimpanan tambahan.Selain itu, optimisasi untuk fungsi kompleks mungkin membutuhkan terlalu banyak waktu untuk dilakukan.Memukul batas internal akan melaporkan kesalahan di jendela Output Studio, termasuk:

Fungsi 'f' pada baris 20 melebihi batas instruksi blok kode tunggal

Kesalahan ini berarti bahwa satu blok kode di dalam fungsi menggunakan lebih dari 64K instruksi.Ini dapat dihindari dengan memper简化 fungsi atau dengan membaginya menjadi fungsi yang lebih kecil secara individual.

Fungsi 'f' pada baris 20 melebihi batas kode fungsi

Kesalahan ini berarti bahwa fungsi tunggal berisi lebih dari 32K blok kode internal.Blok kode internal tidak persis mencocok dengan blok aliran kontrol dalam skrip Anda, tetapi kesalahan ini dapat dihindari dengan memper简化 aliran kontrol dalam fungsi atau dengan membaginya menjadi fungsi yang lebih kecil.

Fungsi 'f' pada baris 200 melebihi batas instruksi modul total

Kesalahan ini berarti bahwa, secara total, fungsi telah mencapai batas 1 juta instruksi untuk seluruh skrip.Dalam beberapa kasus, fungsi yang dilaporkan sendiri mungkin memiliki banyak instruksi, atau batas mungkin telah tercapai oleh fungsi sebelumnya di skrip.Untuk menghindari masalah ini, disarankan untuk memindahkan fungsi khusus besar ke skrip non-asli terpisah atau menggunakan @native pada fungsi lainnya.Anda juga dapat mencoba menandai skrip terpisah itu dengan --!native , tetapi 1 juta instruksi mengambil banyak memori dan Anda mungkin melebihi batas memori.

*Fungsi 'f' pada baris 20 mengalami kegagalan penurunan internal *(atau) Kesalahan internal: Pembuatan kode asli gagal (penurunan assemblasi)

Terkadang fungsi berisi bagian kode rumit yang kompiler kode asli tidak dapat ditangani saat ini.Untuk menghindari kesalahan ini, periksa ekspresi kompleks dalam kode dan bagi mereka atau sederhanakan mereka, tetapi pertimbangkan juga untuk membuka laporan bug dengan contoh kode yang gagal karena alasan ini.

Batas alokasi memori tercapai untuk pembuatan kode asli

Kesalahan ini berarti batas memori keseluruhan untuk data kode asli telah tercapai.Untuk menghindari ini, coba hapus --!native dari skrip yang lebih intensif memori, memungkinkan lebih banyak skrip yang lebih kecil masuk di bawah batas.Alternatifnya, pindahkan fungsi besar atau jarang dipanggil ke modul non-asli terpisah.