Dengan dukungan Luau untuk generasi kode asli, skrip sisi server dalam permainan Anda dapat dikompilasi langsung menjadi instruksi kode mesin yang dieksekusi oleh CPU, bukannya bytecode reguler yang dioperasikan 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 pustaka Luau atau API Roblox yang berat.
Mengaktifkan generasi kode asli
Untuk mengaktifkan generasi kode asli untuk Script, tambahkan komentar --!native di bagian atas:¹
--!nativeprint("Halo dari kode asli!")
Ini mengaktifkan generasi kode asli untuk semua fungsi dalam skrip, dan ruang lingkup tingkat atas, jika dianggap menguntungkan. Tidak ada perubahan tambahan yang diperlukan; perilaku skrip yang dieksekusi secara asli sama persis dengan sebelumnya dan hanya performanya yang berbeda. Semua fitur bahasa Luau dan semua API Roblox tetap didukung.
Sebagai alternatif, Anda dapat mengaktifkan generasi kode asli untuk fungsi individu dengan menambahkan atribut @native:
@native
local function f(x)
return (x + 1)
end
Praktik terbaik
Tips berikut akan membantu Anda mendapatkan manfaat paling banyak dari generasi kode asli:
Sebaiknya aktifkan fitur ini di dalam skrip yang melakukan banyak perhitungan langsung di dalam Luau. Jika Anda memiliki banyak operasi matematis pada tabel dan terutama tipe buffer, skrip tersebut mungkin menjadi kandidat yang baik.
Hanya fungsi dalam skrip yang dikompilasi secara asli. Kode dalam ruang lingkup luar atas sering kali hanya dieksekusi sekali dan tidak mendapatkan manfaat sebanyak fungsi yang dipanggil berkali-kali, terutama yang dipanggil setiap frame.
Sangat disarankan agar Anda mengukur waktu yang dibutuhkan sebuah skrip atau fungsi dengan dan tanpa kompilasi asli untuk menilai kapan sebaiknya menggunakannya. Alat Script Profiler dapat mengukur performa fungsi untuk membuat keputusan yang tepat.
Mungkin menggoda untuk menempatkan komentar --!native di setiap skrip untuk berjaga-jaga jika beberapa di antaranya akan dieksekusi lebih cepat, tetapi generasi kode asli memiliki beberapa kelemahan:
- Waktu kompilasi kode dibutuhkan yang dapat meningkatkan waktu startup server.
- Memori ekstra digunakan untuk menyimpan kode yang dikompilasi secara asli.
- Ada batasan pada jumlah total kode yang dikompilasi secara asli yang diizinkan dalam sebuah game.
Masalah-masalah ini dapat diatasi dengan penggunaan yang bijaksana dari atribut @native.
Kode yang harus dihindari
Sementara semua fitur akan berperilaku sama dengan atau tanpa generasi kode asli diaktifkan, beberapa di antaranya tidak akan berjalan secara asli dan mungkin menyebabkan de‑optimisasi atau kembali ke eksekusi yang diinterpretasikan. Ini termasuk:
- Penggunaan berbagai fungsi bawaan Luau seperti math.asin() dengan argumen non-numerik.
- Meneruskan parameter yang tidak sesuai tipe ke fungsi bertipe, misalnya memanggil foo(true) ketika foo dideklarasikan sebagai function foo(arg: string). Ingatlah untuk selalu menggunakan anotasi tipe yang benar.
Saat menggunakan Script Profiler, Anda dapat membandingkan waktu yang dibutuhkan oleh versi normal fungsi dibandingkan dengan yang dikompilasi secara asli. Jika sebuah fungsi di dalam skrip --!native atau yang ditandai dengan @native tidak tampak sedang dieksekusi secara asli, satu atau lebih faktor dari daftar di atas mungkin memicu de‑optimisasi.
Gunakan anotasi tipe
Generasi kode asli berusaha untuk menyimpulkan tipe yang paling mungkin untuk variabel tertentu guna mengoptimalkan jalur kode. Misalnya, diasumsikan bahwa a + b dilakukan pada angka, atau bahwa tabel diakses di t.X. Namun, dengan adanya overloading operator, a dan b bisa jadi adalah tabel atau tipe Vector3, atau t bisa jadi adalah tipe data Roblox.
Sementara generasi kode asli akan mendukung tipe apapun, prediksi yang salah dapat memicu pemeriksaan yang tidak perlu, yang mengakibatkan eksekusi kode yang lebih lambat.
Untuk menyelesaikan beberapa masalah umum, anotasi tipe Luau pada argumen fungsi diperiksa, tetapi sangat dianjurkan untuk mengannotasi argumen Vector3:
--!native
-- "v" diasumsikan sebagai tabel; fungsi berjalan lebih lambat karena pemeriksaan tabel
local function sumComponentsSlow(v)
return v.X + v.Y + v.Z
end
-- "v" dinyatakan sebagai Vector3; kode khusus untuk vektor dihasilkan
local function sumComponentsFast(v: Vector3)
return v.X + v.Y + v.Z
end
Alat Studio
Alat Studio berikut didukung untuk skrip --!native dan fungsi @native.
Debugging
Debugging umum dari skrip didukung, tetapi tampilan untuk local/upvalues mungkin tidak lengkap dan kehilangan variabel dari frame call stack yang dieksekusi secara asli.
Perlu dicatat juga bahwa saat melakukan debugging kode yang dipilih untuk kompilasi asli, menempatkan breakpoints akan menonaktifkan eksekusi asli untuk fungsi-fungsi tersebut.
Script Profiler
Dalam Script Profiler, fungsi yang dieksekusi secara asli ditampilkan dengan <native> di sampingnya:

Jika sebuah fungsi yang ditandai @native atau di dalam skrip --!native tidak menampilkan anotasi <native>, fungsi tersebut mungkin tidak sedang dieksekusi secara asli karena penempatan breakpoint, penggunaan kode yang tidak dianjurkan, atau tidak cocoknya anotasi tipe.
Luau heap
Dalam profiler Luau heap, memori yang digunakan oleh fungsi asli ditampilkan sebagai elemen [native] dalam grafik.

Analisis ukuran
Setiap skrip yang dikompilasi secara asli mengkonsumsi memori. Ketika ukuran kode yang dikompilasi mencapai batasan yang telah ditetapkan, kompilasi asli dihentikan dan sisa kode dijalankan secara non-asin. Ini membuat penting untuk memilih skrip dengan hati-hati untuk kompilasi asli.
Untuk memantau ukuran kode asli dari fungsi dan skrip individu:
- Pastikan Anda berada dalam tampilan Server melalui tombol client/server toggle.
- Panggil debug.dumpcodesize() dari Command Bar.
Di jendela Output, Anda akan melihat jumlah total skrip dan fungsi yang telah dikompilasi secara asli hingga saat pemanggilan, memori yang dikonsumsi oleh kode asli mereka, dan batas ukuran kode asli. Setelah ringkasan, Anda akan melihat tabel untuk setiap skrip yang dikompilasi secara asli dalam urutan menurun berdasarkan ukuran kode.

Untuk setiap skrip, output menampilkan jumlah fungsi yang dikompilasi dan konsumsi memori kode asli. Setiap fungsi kemudian dicantumkan dalam urutan menurun berdasarkan ukuran kode asli, dengan fungsi anonim ditampilkan sebagai [anonymous] dan seluruh skrip ditampilkan sebagai [top level]. Di kolom terakhir, persentase dihitung terkait dengan batas ukuran kode asli. Perlu dicatat bahwa ukuran kode asli dari fungsi dilaporkan secara akurat tetapi konsumsi memori untuk skrip dibulatkan ke halaman ukuran terdekat.
Batas dan pemecahan masalah
Mengompilasi kode menjadi instruksi untuk CPU tertentu membutuhkan memori penyimpanan tambahan. Selain itu, optimasi untuk fungsi kompleks mungkin memerlukan terlalu banyak waktu untuk dilakukan. Menyentuh batas internal akan melaporkan kesalahan di jendela Output Studio, termasuk:
Fungsi 'f' di 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 menyederhanakan fungsi atau dengan membaginya menjadi fungsi-fungsi kecil yang terpisah.
Fungsi 'f' di baris 20 melebihi batas blok kode fungsi
Kesalahan ini berarti bahwa satu fungsi berisi lebih dari 32K blok kode internal. Blok kode internal tidak sepenuhnya dipetakan ke blok kontrol aliran di skrip Anda, tetapi kesalahan ini dapat dihindari dengan menyederhanakan aliran kontrol dalam fungsi atau dengan membaginya menjadi fungsi-fungsi kecil yang terpisah.
Fungsi 'f' di baris 200 telah mencapai batas instruksi total modul
Kesalahan ini berarti bahwa, secara total, fungsi telah mencapai batas 1 juta instruksi untuk seluruh skrip. Dalam beberapa kasus, fungsi yang dilaporkan itu sendiri mungkin memiliki banyak instruksi, atau batas tersebut mungkin telah dicapai oleh fungsi-fungsi sebelumnya dalam skrip. Untuk menghindari masalah ini, disarankan untuk memindahkan fungsi-fungsi yang sangat besar ke dalam skrip non-asli terpisah atau menggunakan @native pada fungsi-fungsi lainnya. Anda juga dapat mencoba menandai skrip terpisah itu dengan --!native, tetapi 1 juta instruksi memakan banyak memori dan Anda mungkin melebihi batas memori.
Fungsi 'f' di baris 20 mengalami kegagalan internal saat penurunan (atau)
Kesalahan internal: Generasi kode asli gagal (penurunan assembly)
Terkadang fungsi berisi bagian kode yang kompleks yang tidak dapat ditangani oleh kompiler kode asli saat ini. Untuk menghindari kesalahan ini, periksa ekpresi kompleks dalam kode dan pisahkan atau sederhanakan, tetapi juga pertimbangkan untuk membuka laporan bug dengan contoh kode yang gagal karena alasan ini.
Batas alokasi memori telah tercapai untuk generasi kode asli
Kesalahan ini berarti bahwa batas maksimum memori untuk data kode asli telah tercapai. Untuk menghindari hal ini, coba hapus --!native dari skrip yang lebih banyak menggunakan memori, memungkinkan lebih banyak skrip kecil yang sesuai di bawah batas. Alternatifnya, pindahkan fungsi-fungsi besar atau yang jarang dipanggil ke modul non-asli terpisah.