Eventi del motore posticipati

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

La proprietà Workspace.SignalBehavior controlla se i gestori degli eventi vengono attivati immediatamente o posticipati. L'opzione Enum.SignalBehavior.Deferred è raccomandata in quanto aiuta a migliorare le prestazioni e la correttezza del motore. I gestori degli eventi per eventi posticipati vengono ripresi al successivo punto di ripresa, insieme a eventuali gestori di eventi attivati di recente.

Il seguente diagramma confronta il comportamento degli eventi Immediate e Deferred.

  • Con il comportamento Immediate, se un evento attiva un altro evento, il secondo gestore dell'evento si attiva immediatamente.
  • Con il comportamento Deferred, il secondo evento viene aggiunto alla coda e viene eseguito successivamente.

Il tempo totale impiegato non cambia, ma l'ordinamento è diverso.

Un confronto di tre gestori di eventi che si attivano con il comportamento Immediate e Deferred

"La reinserzione" impedisce agli eventi di attivarsi continuamente l'uno con l'altro quando raggiungono una certa profondità. Il limite attuale per questo è 10.

Vantaggi degli eventi posticipati

Il comportamento Immediate presenta alcuni svantaggi. Per ogni istanza aggiunta al tuo gioco, proprietà che cambia o qualche altro trigger attivato, il motore deve eseguire codice Luau prima che accada qualsiasi altra cosa.

  • Per cambiare 1.000 proprietà, potrebbero dover essere eseguiti 1.000 frammenti di codice dopo ogni cambiamento.
  • Possono verificarsi bug strani e difficili da diagnosticare, come un evento di rimozione che si attiva prima che qualcosa sia stato persino aggiunto.
  • I sistemi critici per le prestazioni possono attivare eventi che richiedono di tornare e andare avanti a Luau.
  • I gestori degli eventi possono apportare modifiche al posto o attivare altri eventi ogni volta che un evento viene attivato.
  • Un evento può attivarsi più volte nonostante sia ridondante, come una proprietà che cambia due volte.

Avendo porzioni specifiche del ciclo di vita del motore in cui Luau può essere eseguito, il motore può ottenere prestazioni migliorate utilizzando una serie di assunzioni:

  • I sistemi critici per le prestazioni non devono yieldare a Luau, il che porta a guadagni di prestazioni.
  • A meno che il motore stesso non lo cambi, il posto non cambia mai al di fuori di un punto di ripresa.

Punti di ripresa

Dopo essere stato posticipato, un gestore di eventi viene ripreso al successivo punto di ripresa. Attualmente, il set di punti di ripresa include:

Modelli di codice comuni interessati

Con eventi remoti, i seguenti esempi smettono di funzionare correttamente o hanno un comportamento leggermente diverso; si basano sul fatto che gli eventi vengano ripresi immediatamente.

Attivare e catturare eventi durante l'esecuzione

In questo esempio, false viene sempre restituito quando gli eventi posticipati sono abilitati perché il callback non è stato eseguito. Per funzionare correttamente, il thread deve yieldare fino almeno a quando l'evento avrebbe dovuto attivarsi.


local success = false
event:Connect(function ()
success = true
end)
doSomethingToTriggerEvent() -- Porta all'attivazione di `event`
return success

Ascoltare la prima occorrenza di un evento


connection = event:Connect(function ()
connection:Disconnect()
-- fare qualcosa
end)

Con gli eventi posticipati abilitati, più attivazioni del gestore dell'evento possono essere messe in coda prima che tu disconnetta dall'evento. Chiamare Disconnect() annulla tutte le attivazioni in attesa del gestore dell'evento: lo stesso comportamento esiste per eventi immediati.

In alternativa, utilizza Once() come metodo più conveniente per collegarti a un evento di cui hai bisogno solo della prima attivazione.

Eventi che cambiano la discendenza o le proprietà

Gli eventi posticipati causano eventi che gestiscono un cambiamento nella discendenza o in una proprietà per attivarsi dopo che la discendenza o la proprietà sono cambiate:


local part = Instance.new("Part", workspace)
local function onPartDestroying()
print("In signal:", part:GetFullName(), #part:GetChildren())
end
part.Destroying:Connect(onPartDestroying)
part:Destroy()

Poiché Destroy() funziona immediatamente dopo che lo script che lo ha chiamato yielda, l'istanza è già stata distrutta nel momento in cui onPartDestroying() viene chiamato. Per ulteriori esempi, vedere Instance.Destroying.

© 2026 Roblox Corporation. Roblox, il logo Roblox e Powering Imagination sono tra i nostri marchi registrati e non registrati negli Stati Uniti. e altri paesi.