Pianificare il codice è utile in molte situazioni, come garantire che il codice venga eseguito dopo che un'azione specifica o un ciclo è stato completato, o ritardare il codice per una durata specifica. Puoi utilizzare la libreria task per ottimizzare il task scheduler di Roblox per gestire e pianificare il codice. Puoi anche utilizzare una libreria simile chiamata coroutine per pianificare il codice che ha alcune funzionalità aggiuntive.
Metodi comuni
I seguenti sono i metodi task più comuni utilizzati per pianificare il codice. Dovresti usare i metodi di task rispetto ai metodi di pianificazione legacy, come wait(), per garantire che il tuo codice venga eseguito in modo ottimale.
La seguente tabella elenca i metodi globali legacy pertinenti e le loro controparti preferite e più ottimizzate:
| Metodi globali legacy | Metodi di task | Alternativa aggiuntiva |
|---|---|---|
| wait() | task.wait() | RunService.Heartbeat |
| wait(n) | task.wait(n) | |
| spawn(f) | task.defer(f) | task.delay(0, f) |
| delay(n, f) | task.delay(n, f) | |
| spawn(function() f(uv1, ...) end) | task.defer(f, uv1, ...) | task.delay(0, f, uv1, ...) |
| delay(n, function() f(uv1, ...) end) | task.delay(n, f, uv1, ...) |
task.spawn()
task.spawn() prende un thread o una funzione e lo riprende immediatamente attraverso il scheduler del motore. Gli argomenti aggiuntivi vengono passati al thread o alla funzione che viene ripresa.
Il seguente esempio di codice è un esempio di come puoi utilizzare task.spawn() quando chiami una funzione che può yield mentre itera su un insieme di oggetti:
local function playerAdded(player)
print(player)
end
for _, player in Players:GetPlayers() do
task.spawn(playerAdded, player)
end
task.defer()
task.defer() prende un thread o una funzione e lo rinvia fino alla fine del punto di ripresa corrente all'interno del frame attuale. Gli argomenti aggiuntivi vengono passati al thread o alla funzione che viene ripresa.
Dovresti utilizzare questo metodo quando desideri un comportamento simile a task.spawn() ma non ti interessa che il thread venga eseguito immediatamente. Il seguente esempio di codice illustra come la dichiarazione print() per "A" verrà rinviata fino a dopo l'esecuzione della dichiarazione print() per "B":
task.defer(print, "A")print("B")--> B--> A
task.delay()
task.delay() prende un thread o una funzione e lo programma per la ripresa dopo che è trascorso il tempo dato nel prossimo passo di Heartbeat. Il thread riprende con gestione degli errori integrata e supporto per altre funzionalità del motore. Qualsiasi argomento aggiuntivo viene passato al thread o alla funzione che viene ripresa.
Poiché il tempo di attesa effettivo può variare, il seguente esempio di codice illustra come puoi calcolarlo passando il tempo corrente come argomento:
task.delay(2, function(scheduledTime)
print(os.clock() - scheduledTime) --> 2.038702
end, os.clock())
Una durata di zero comporterà che il thread o la funzione riprendano nel passo successivo.
task.wait()
task.wait() interrompe il thread corrente fino a quando la durata data (in secondi) non è trascorsa e poi riprende il thread nel prossimo passo di Heartbeat.
Il tempo di yield effettivo può variare. Il seguente esempio di codice illustra come questo metodo restituisce il valore per comodità:
Poiché il tempo di attesa effettivo può variare, il seguente esempio di codice illustra come puoi ottenere il tempo effettivo memorizzando il valore di ritorno del metodo:
local elapsedTime = task.wait(2) -- Aspetta 2 secondiprint(elapsedTime) --> 2.0792941
Se non viene fornita alcuna durata, la durata predefinita sarà zero, il che significa che il thread riprenderà automaticamente nel passo successivo. Questo significa che task.wait() è equivalente nel comportamento a RunService.Heartbeat.