Die Workspace.SignalBehavior-Eigenschaft steuert, ob Ereignis-Handler sofort oder verschoben ausgelöst werden. Die Enum.SignalBehavior.Deferred-Option wird empfohlen, da sie die Leistung und Korrektheit des Motors verbessert. Die Ereignis-Handler für verschobene Ereignisse werden am nächsten Wiederaufnahmepunkt fortgesetzt, zusammen mit neu ausgelösten Ereignis-Handlern.
Das folgende Diagramm vergleicht das Verhalten von Immediate-Ereignissen und das Verhalten von Deferred-Ereignissen.
- Bei dem Immediate-Verhalten, wenn ein Ereignis ein anderes Ereignis auslöst, wird der zweite Ereignis-Handler sofort ausgeführt.
- Bei dem Deferred-Verhalten wird das zweite Ereignis am Ende einer Warteschlange hinzugefügt und später ausgeführt.
Die Gesamtzeit ändert sich nicht, aber die Reihenfolge ist anders.

"Re-Entrancy" verhindert, dass Ereignisse sich gegenseitig immer wieder auslösen, wenn sie eine bestimmte Tiefe erreichen. Das aktuelle Limit dafür liegt bei 10.
Vorteile verschobener Ereignisse
Das Immediate-Verhalten hat einige Nachteile. Für jede Instanz, die zu deinem Spiel hinzugefügt wird, jede Eigenschaft, die sich ändert, oder ein anderer ausgelöster Trigger muss die Engine Luau-Code ausführen, bevor etwas anderes passiert.
- Um 1.000 Eigenschaften zu ändern, müssen potenziell 1.000 Code-Schnipsel nach jeder Änderung ausgeführt werden.
- Seltsame, schwer zu diagnostizierende Fehler können auftreten, wie zum Beispiel, dass ein Entfernen-Ereignis ausgelöst wird, bevor etwas hinzugefügt wurde.
- Leistungswichtige Systeme können Ereignisse auslösen, die verlangen, dass sie hin und her zu Luau zurückkehren.
- Ereignis-Handler können jederzeit Änderungen am Ort vornehmen oder andere Ereignisse auslösen, wenn ein Ereignis ausgelöst wird.
- Ein Ereignis kann mehrere Male ausgelöst werden, obwohl es redundant ist, wie z.B. wenn sich eine Eigenschaft zweimal ändert.
Indem spezifische Abschnitte des Lebenszyklus der Engine festgelegt werden, in denen Luau ausgeführt werden kann, kann die Engine durch die Nutzung einer Reihe von Annahmen eine verbesserte Leistung erzielen:
- Leistungswichtige Systeme müssen nicht an Luau abgeben, was zu Leistungsvorteilen führt.
- Sofern die Engine selbst nichts ändert, wird der Platz außerhalb eines Wiederaufnahmepunkts nie verändert.
Wiederaufnahmepunkte
Nach der Verschiebung wird ein Ereignis-Handler am nächsten Wiederaufnahmepunkt fortgesetzt. Derzeit umfasst die Menge der Wiederaufnahmepunkte:
- Eingabeverarbeitung (wird einmal pro Eingabe fortgesetzt, die verarbeitet werden muss, siehe UserInputService)
- Legacy-Warten-Skript-Wiederaufnahme wie wait(), spawn() und delay()
Häufig betroffene Code-Muster
Bei Remote-Ereignissen funktionieren die folgenden Beispiele entweder nicht mehr korrekt oder haben subtil unterschiedliche Verhaltensweisen; sie hängen davon ab, dass Ereignisse sofort wiederaufgenommen werden.
Ereignisse während der Ausführung auslösen und abfangen
In diesem Beispiel wird immer false zurückgegeben, wenn verschobene Ereignisse aktiviert sind, da der Callback nicht ausgeführt wurde. Um korrekt zu funktionieren, muss der Thread warten, bis mindestens das Ereignis hätte ausgelöst werden sollen.
local success = false
event:Connect(function ()
success = true
end)
doSomethingToTriggerEvent() -- Löst das `event` aus
return success
Auf das erste Auftreten eines Ereignisses hören
connection = event:Connect(function ()
connection:Disconnect()
-- etwas tun
end)
Mit aktivierten verschobenen Ereignissen können mehrere Aufrufe des Ereignis-Handlers in die Warteschlange gestellt werden, bevor du dich vom Ereignis trennst. Der Aufruf von Disconnect() verwirft alle ausstehenden Aufrufe von Ereignis-Handlern – das gleiche Verhalten, das es auch für unmittelbare Ereignisse gibt.
Alternativ kannst du Once() als bequemere Methode verwenden, um dich mit einem Ereignis zu verbinden, von dem du nur die erste Ausführung benötigst.
Ereignisse, die Ancestry oder Eigenschaften ändern
Verschobene Ereignisse verursachen, dass Ereignisse, die eine Änderung der Ancestry oder einer Eigenschaft behandeln, nach der Änderung der Ancestry oder Eigenschaft ausgelöst werden:
local part = Instance.new("Part", workspace)
local function onPartDestroying()
print("Im Signal:", part:GetFullName(), #part:GetChildren())
end
part.Destroying:Connect(onPartDestroying)
part:Destroy()
Da Destroy() sofort funktioniert, nachdem das Skript, das es aufgerufen hat, abgibt, wurde die Instanz bereits zerstört, als onPartDestroying() aufgerufen wird. Für weitere Beispiele siehe Instance.Destroying.