Con il supporto di Luau per la generazione del codice nativo, gli script lato server nella tua esperienza possono essere compilati direttamente nelle istruzioni del codice macchina che le CPU eseguono, piuttosto che il bytecode regolare che la VM Luau esegue.Questa funzione può essere utilizzata per migliorare la velocità di esecuzione per alcuni script sul Server, in particolare quelli che hanno molte operazioni numeriche senza utilizzare troppi richiami di libreria Luau pesanti o chiamate API di Roblox.
Abilita la generazione del codice nativo
Per abilitare la generazione del codice nativo per un Script , aggiungi il commento --!native in cima:¹
--!nativeprint("Hello from native code!")
Questo consente la generazione del codice nativo per tutte le funzioni nello script e la scoperta di alto livello, se ritenuta redditizia.Non sono richeste modifiche aggiuntive; il comportamento degli script in esecuzione nativa è esattamente lo stesso di prima e solo le prestazioni sono diverse.Tutte le funzionalità della lingua Luau e tutte le API Roblox rimangono supportate.
In alternativa, puoi abilitare la generazione del codice nativo per una funzione individuale aggiungendo l'attributo @native :
@native
local function f(x)
return (x + 1)
end
Migliori pratiche
I seguenti suggerimenti ti aiuteranno a trarre il maggior beneficio dalla generazione del codice nativo:
È meglio abilitare questa funzione all'interno degli script che eseguono molte operazioni direttamente all'interno di Luau.Se hai molte operazioni matematiche su tabelle e in particolare buffer tipi, lo script può essere un buon candidato.
Solo le funzioni dello script sono compilate in modo nativo.Il codice nella parte superiore esterna ambito è spesso eseguito solo una volta e non beneficia tanto quanto le funzioni che vengono chiamate molte volte, in particolare quelle che vengono chiamate ogni frame.
Si consiglia di misurare il tempo che uno script o una funzione richiede con e senza compilazione nativa per giudicare quando è meglio usarlo.Lo strumento Profilatore di script può misurare le prestazioni delle funzioni per prendere decisioni informate.
Può essere tentante posizionare il commento --!native in ogni script solo nel caso che alcuni di essi verranno eseguiti più rapidamente, ma la generazione del codice nativo ha alcuni difetti:
- È richiesto il tempo di compilazione del codice che può aumentare il tempo di avvio dei server.
- La memoria extra è occupata per archiviare codice compilato nativamente.
- C'è un limite sull'importo totale consentito di codice compilato nativamente in un'esperienza.
Questi problemi possono essere affrontati con un uso giudizioso dell'attributo @native.
Codice da evitare
Mentre tutte le funzionalità si comporteranno allo stesso modo con o senza la generazione di codice nativo abilitata, alcune di esse non si eseguiranno native e potrebbero causare una de-ottimizzazione o un ricorso all'esecuzione interpretata.Queste includono:
- Uso di diverse funzioni integrate di Luau come math.asin() con argomenti non numerici.
Quando si utilizza il Profilatore di script, puoi confrontare il tempo impiegato da una versione regolare della funzione rispetto a quella compilata inizialmente.Se una funzione all'interno di uno script non sembra essere eseguita in modo nativo, uno o più fattori dalla lista sopra possono attivare la de-ottimizzazione.
Usa le annotazioni di tipo
Gli tentativi di generazione del codice nativo cercano di inferire il tipo più probabile per una variabile data per ottimizzare i percorsi del codice.Ad esempio, si presume che a + b venga eseguito sui numeri, o che una tabella venga accessata in t.X .Dato l'ipercarico dell'operatore, tuttavia, a e b possono essere tabelle o Vector3 tipi, o t possono essere un tipo di dati Roblox.
Mentre la generazione del codice nativo supporterà qualsiasi inserisci / scrivi, le previsioni errate possono attivare controlli non necessari, causando un'esecuzione del codice più lenta.
Per risolvere alcuni problemi comuni, viene controllata l'annotazione Luau sul tipo di argomenti della funzione, ma è particolarmente raccomandato annotare gli argomenti Vector3 :
--!native
-- si presume che "v" sia una tabella; la funzione si esegue più lentamente a causa dei controlli della tabella
local function sumComponentsSlow(v)
return v.X + v.Y + v.Z
end
-- ""v" è dichiarato essere un Vector3; viene generato un codice specializzato per i veicoli
local function sumComponentsFast(v: Vector3)
return v.X + v.Y + v.Z
end
Strumentazione dello studio
La seguente attrezzatura Studio è supportata per --!native script e @native.
Debuggenza
La generale debugging degli script è supportata, ma le viste per gli insider/upvalues possono essere incomplete e mancare le variabili dalla call stack frame che vengono eseguite in modo nativo.
Si noti inoltre che quando si debugga il codice selezionato per la compilazione nativa, posizionare punti di interruzione disabiliterà l'esecuzione nativa per quelle funzioni.
Profilatore di script
Nel Profilatore di script, le funzioni che eseguono in modo nativo visualizzano <native> accanto a loro:

Se una funzione contrassegnata @native o all'interno di uno script --!native non mostra l'annotazione <native> , quella funzione potrebbe non essere eseguita in modo nativo a causa del posizionamento punto di interruzione , dell'uso del codice scoraggiato o delle annotazioni di tipo diverso.
Pila di Luau
Nel profilatore Luau heap le memorie prese dalle funzioni native vengono visualizzate come [native] elementi nel grafico.

Analisi delle dimensioni
Ogni script compilato nativamente consuma memoria.Quando la dimensione del codice compilato raggiunge un limite predefinito, la compilazione nativa si ferma e il codice rimanente viene eseguito non nativamente.Questo rende essenziale scegliere attentamente gli script per la compilazione nativa.
Per monitorare la dimensione del codice nativo delle singole funzioni e script:
- Assicurati di essere nella vista Server attraverso il pulsante client/server toggle.
- Invoca debug.dumpcodesize() dal Comando Bar.
Nella finestra Output, vedrai il numero totale di script e funzioni che sono stati compilati nativamente fino al punto di invocazione, la memoria consumata dal loro codice nativo e il limite delle dimensioni del codice nativo.Dopo il Sommario, vedrai una tabella per ogni script compilato nativamente in ordine crescente della dimensione del codice.

Per ogni script, l'output visualizza il numero di funzioni compilate e il consumo di memoria del codice nativo.Ogni funzione viene quindi elencata in ordine decrescente della dimensione del codice nativo, con funzioni anonime mostrate come [anonymous] e script completi mostrati come [top level].Nella colonna finale, la percentuale viene calcolata rispetto al limite delle dimensioni del codice nativo.Si noti che la dimensione del codice nativo delle funzioni viene riportata con precisione, ma il consumo di memoria per gli script viene arrotondato alla dimensione della pagina più vicina.
Limitazioni e risoluzione dei problemi
La compilazione del codice in istruzioni per una particolare CPU richiede ulteriori memorie di archiviazione.Inoltre, le ottimizzazioni per funzioni complesse possono richiedere troppo tempo per essere eseguite.Colpire un limite interno riporterà un errore nella finestra Output di Studio, incluso:
Funzione 'f' alla linea 20 ha superato il limite di istruzione del singolo blocco di codice
Questo errore significa che un singolo blocco di codice all'interno di una funzione utilizza più di 64K istruzioni.Questo può essere evitato semplificando la funzione o dividendola in funzioni più piccole individuali.
Funzione 'f' alla linea 20 ha superato il limite del blocco del codice funzione
Questo errore significa che una singola funzione contiene più di 32K blocchi interni di codice.I blocchi di codice interni non corrispondono esattamente ai blocchi di flusso di controllo nel tuo script, ma questo errore può essere evitato semplificando il flusso di controllo nella funzione o dividendolo in piccole funzioni separate.
Funzione 'f' alla linea 200 ha superato il limite di istruzioni del modulo totale
Questo errore significa che, in totale, la funzione ha raggiunto un limite di 1 milione di istruzioni per l'intero script.In alcuni casi, la funzione segnalata stessa potrebbe avere molte istruzioni, o il limite potrebbe essere stato raggiunto da funzioni precedenti nello script.Per evitare questo problema, si consiglia di spostare le funzioni particolarmente grandi in uno script separato non nativo o di utilizzare @native su altre funzioni.Puoi anche provare a contrassegnare quel script separato con --!native , ma 1 milione di istruzioni occupa molta memoria e potresti superare il limite di memoria.
*Funzione 'f' alla linea 20 ha riscontrato un errore interno di riduzione *(o) Errore interno: generazione del codice nativo non riuscita (abbassamento dell'assemblaggio)
A volte una funzione contiene complessi bit di codice che il compilatore di codice nativo non può gestire attualmente.Per evitare questo errore, ispeziona le espressioni complesse nel codice e dividerle o semplificarle, ma considera anche l'apertura di un rapporto di bug con un esempio del codice che ha fallito per questo motivo.
Limite di assegnazione della memoria raggiunto per la generazione del codice nativo
Questo errore significa che il limite generale della memoria per i dati del codice nativo è stato raggiunto.Per evitare questo, prova a rimuovere --!native da gli script più intensivi in termini di memoria, consentendo a più script più piccoli di adattarsi al limite.In alternativa, sposta le funzioni grandi o poco chiamate in un modulo non nativo separato.