Generazione del codice nativo

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

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 eseguono i CPU, invece che nel codice di esecuzione regolare che il Luau VM esegue. Questa funzione può essere utilizzata per migliorare la velocità di esecuzione per alcuni script sul Server, in particolare quelli che hanno un sacco di calcoli numerici senza utilizzare troppi pesanti istruzioni del codice Luau o chiamate API

Abilitare il nativo

Per abilitare la generazione del codice nativo per un Script , aggiungi il commento --!native alla parte superiore:1


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

Questo consente la generazione del codice nativo per tutte le funzioni nello script, e la scala di livello superiore, se ritenuta utile. Non sono richieste modifiche aggiuntive; il comportamento dello script in esecuzione nativamente è esattamente lo stesso di prima e solo la performance è diversa. Tutte le funzionalità della lingua Luau e tutte le API Roblox sono 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
1 In futuro, alcuni script potrebbero iniziare automaticamente ad essere eseguiti in nativo se è determinato che sia redditizio, ma posizionati manualmente i commenti --!native .

Migliori Pratiche

I seguenti suggerimenti ti aiuteranno a beneficiare maggiormente dalla generazione del codice nativo:

  • È meglio abilitare questa funzione all'interno degli script che eseguono molte operazioni di calcolo direttamente all'interno di Luau. Se hai molte operazioni matematiche su tabelle e in particolare buffer tipi, lo script potrebbe essere un buon candidato.

  • Solo le funzioni dello script funzionano in modo nativo. Il codice nell'area di lavoro esterna superiore viene spesso eseguito solo una volta e non beneficia tanto quanto le funzioni che vengono chiamate molte volte, in particolare quelle che vengono chiamate ogni volta.

  • Si consiglia di misurare il tempo che impiega uno script o una funzione con e senza la compilazione nativa per giudicare quando è meglio usarlo. Lo strumento Script Profiler può misurare le prestazioni delle funzioni per prendere decisioni informate.

  • Potrebbe essere tentante inserire il commento --!native in ogni script solo per il caso in cui alcuni di loro eseguiranno più velocemente, ma la generazione del codice nativo ha alcuni svantaggi:

    • Tempo di compilazione del codice è richiesto, il che può aumentare il tempo di avvio dei server.
    • La memoria extra è occupata per memorizzare il codice compilato in modo nativo.
    • C'è un limite sull'importo totale di codice nativamente compilato in un'esperienza.

Questi problemi possono essere affrontati con l'uso giudizio del attributo @native .

Codice da evitare

Mentre tutte le funzionalità si comporteranno allo stesso modo con o senza la generazione del codice nativo abilitata, alcune di esse non saranno eseguite in modo nativo e potrebbero causare de-ottimizzazione o un fallback all'esecuzione interpretata. Ciò include:

  • Uso di deprecato getfenv() / setfenv() chiami.
  • Uso di varie funzioni Luau built-in come math.asin() con argomenti non numerici.
  • Passare parametri non correttamente inseriti alle funzioni, ad esempio chiamando foo(true) quando foo è dichiarato come function foo(arg: string) . Ricorda di utilizzare sempre le corrette 1> tipo di annunci1> .

Quando si utilizza il profilo dello script, si può confrontare il tempo richiesto da una versione regolare della funzione contro quella compilata in nativo. Se una funzione all'interno di uno script --!native > script o contrassegnata con @native non sembra essere in esecuzione in modo nativo, uno o più fattori dalla lista sopra potrebbero essere attivati per la de-ottimizzazione.

Uso delle annotazioni di tipo

La generazione del codice nativo tenta di inferire il tipo più probabile per una variabile specifica al fine di ottimizzare le vie del codice. Ad esempio, si suppone che a + ba + b e b</

Mentre la generazione del codice nativo supporta qualsiasi inserisci / scrivi, le previsioni potrebbero attivare controlli non necessari, causando l'esecuzione di codice più lento.

Per risolvere alcuni problemi comuni, Luau tipo annotazioni sugli argomenti di funzione sono controllati, ma è particolarmente raccomandato di annotare Vector3 argomenti:


--! nativo
-- 「v」 è preso in modo che sia una tabella; la funzione funziona più lentamente a causa di controlli della tabella
local function sumComponentsSlow(v)
return v.X + v.Y + v.Z
end
-- ""v" è dichiarato essere un Vector3; il codice specializzato per i vecettori viene generato
local function sumComponentsFast(v: Vector3)
return v.X + v.Y + v.Z
end

Tooling dello Studio

Il seguente strumento di Studio è supportato per --!native script e funzioni #number1 .

Debug

Il debug generale di script è supportato, ma le visualizzazioni per i locali/up值 potrebbero essere incomplete e mancanti variabili da call stack frame che sono in esecuzione in natura.

Nota anche che quando si debug del codice selezionato per la compilazione nativa, posizionando punti di interruzione disabiliterà l'esecuzione nativa per queste funzioni.

Profilatore di script

Nello Script Profiler, le funzioni che eseguono nativamente visualizzano <native> accanto a loro:

Example of native functions flagged in the Script Profiler

Se una funzione contrassegnata @native o all'interno di uno script --!nativo > mostra l'annotazione < native> , che funzione potrebbe non essere in esecuzione in nativo a causa di 1> punto di interruzione1> posizionamento, l'uso di 4> codice scoraggiato</

Luau Heap

Nella profiler Luau Heap la memoria presa dalle funzioni native viene visualizzata come [native] elementi nella grafica.

Example of native memory usage flagged in the Luau Heap profiler

Analisi delle dimensioni

Ogni script nativamente compilato consuma memoria. Quando la dimensione del codice compilato raggiunge un limite predefinito, la compilazione nativa si ferma e il codice rimanente viene eseguito non in modo nativo. Ciò rende necessario scegliere attentamente gli script per la compilazione nativa.

Per monitorare la dimensione del codice nativo delle singole funzioni e script:

  1. Assicurati di essere in Server visualizzazione attraverso il pulsante client/server toggle .
  2. Invoca debug.dumpcodesize() dalla Barra Comandi .

Nella finestraOutput, vedrai il numero totale di script e funzioni che sono state compilate nativemente fino al punto di invocazione, la memoria consumata dal loro codice nativo e il limite di dimensioni del codice nativo. Dopo la Sommario, vedrai una tabella per ogni script nativamente compilato in ordine crescente di dimensioni.

Example of native code size displayed in the Output window.

Per ciascuno script, l'uscita visualizza il numero di funzioni compilate e il consumo di memoria del codice nativo. Ogni funzione viene quindi elencata in ordine crescente di dimensioni del codice nativo, con funzioni anonime mostrate come [anonymous] e interi script mostrati come [top level] . Nel colonna finale, il percentuale viene calcolato rispetto

Limitazioni e Troubleshooting

La compilazione del codice in istruzioni per un particolare CPU richiede memoria di archiviazione aggiuntiva. Inoltre, le ottimizzazioni per le funzioni complesse potrebbero richiedere troppo tempo per eseguirsi. Colpendere un limite interno segnalerà un errore nella finestra di uscita interna di Studio, tra cui:

La funzione 'f' alla linea 20 ha superato il limite di istruzioni del singolo codice blocco

Questo errore significa che un singolo blocco di codice all'interno di una funzione utilizzata più di 64K istruzioni. Questo può essere evitato semplificando la funzione o dividendola in singoli funzioni più piccole.

La funzione 'f' alla linea 20 ha superato il limite del codice di funzione

Questo errore significa che una singola funzione contiene più di 32K blocchi interni del codice. I blocchi interni del codice non sono esattamente mappeggiano ai blocchi di controllo nel tuo script, ma questo errore può essere evitato semplificando il flusso di controllo nella funzione o dividendolo in singoli funzioni più piccole.

La funzione 'f' alla linea 200 ha superato il limite totale di istruzioni del modulo

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 stessa potrebbe avere molte istruzioni, o il limite potrebbe essere stato raggiunto da funzioni precedenti nello script. Per ev

*La funzione 'f' alla linea 20 ha riscontrato un fallimento di abbassamento interno *(o) Errore interno: generazione del codice nativo (abbassamento)

A volte una funzione contiene bit di codice complessi che il compilatore di codice nativo non può gestire attualmente. Per evitare questo errore, ispeziona i bit di espressione nel codice e li dividi o semplici, ma considera anche l'apertura di un rapporto di errore con un esempio del codice che è fallito per questo motivo.

Limite diallocazione della memoria raggiunto per la generazione del codice nativo

Questo errore significa che il limite di memoria generale per i dati del codice nativo è stato raggiunto. Per evitare questo, prova a rimuovere --!native > dai script più memoria intensiva, consentendo a più piccoli script di adattarsi al limite. In alternativa, sposta le grandi o infrequentemente chiamate funzioni in un modulo separato non nativo.