Oczekujące zdarzenia silnika

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Właściwość Workspace.SignalBehavior kontroluje, czy obsługi zdarzeń są uruchamiane natychmiastowo, czy opóźnione. Opcja Enum.SignalBehavior.Deferred jest zalecana, ponieważ poprawia wydajność i poprawność silnika. Obsługi zdarzeń dla opóźnionych zdarzeń są wznawiane w następnym punkcie wznowienia, wraz z nowo wyzwolonymi obsługami zdarzeń.

Poniższy diagram porównuje zachowanie zdarzeń Immediate i Deferred.

  • Przy zachowaniu Immediate, jeśli jedno zdarzenie wyzwala inne zdarzenie, obsługa drugiego zdarzenia uruchamia się natychmiast.
  • Przy zachowaniu Deferred, drugie zdarzenie jest dodawane na koniec kolejki i uruchamiane później.

Całkowity czas wykonania się nie zmienia, ale kolejność jest inna.

Porównanie trzech obsług zdarzeń uruchamiających się z zachowaniem Immediate i Deferred

"Reentrancja" zapobiega nieprzerwanemu wyzwalaniu się zdarzeń w przypadku osiągnięcia określonej głębokości. Obecny limit wynosi 10.

Korzyści z opóźnionych zdarzeń

Zachowanie Immediate ma pewne wady. Dla każdej instancji dodanej do gry, zmienionej właściwości lub innego wyzwalacza, silnik musi najpierw wykonać kod Luau, zanim cokolwiek innego się zdarzy.

  • Aby zmienić 1 000 właściwości, potencjalnie 1 000 fragmentów kodu musi być uruchomionych po każdej zmianie.
  • Mogą występować dziwne, trudne do zdiagnozowania błędy, takie jak wyzwolenie zdarzenia usuwania przed tym, jak coś zostało dodane.
  • Systemy krytyczne dla wydajności mogą wyzwalać zdarzenia, wymagając powrotu z powrotem do Luau.
  • Obsługi zdarzeń mogą wprowadzać zmiany do miejsca lub wyzwalać inne zdarzenia w każdej chwili, gdy zdarzenie zostaje wyzwolone.
  • Zdarzenie może wyzwalać się wielokrotnie, mimo że jest zbędne, na przykład zmieniając właściwość dwa razy.

Dzięki posiadaniu specyficznych części cyklu życia silnika, w których Luau może działać, silnik może zyskać poprawioną wydajność, korzystając z szeregu założeń:

  • Systemy krytyczne dla wydajności nie muszą powracać do Luau, co prowadzi do zysków wydajności.
  • O ile sam silnik się nie zmienia, miejsce nigdy nie zmienia się poza punktem wznowienia.

Punkty wznowienia

Po opóźnieniu obsługa zdarzenia jest wznawiana w następnym punkcie wznowienia. Obecnie zestaw punktów wznowienia obejmuje:

Powszechne wzorce kodu, które są dotknięte

W przypadku zdarzeń zdalnych następujące przykłady przestają działać poprawnie lub mają subtelnie różne zachowanie; opierają się na natychmiastowym wznawianiu zdarzeń.

Wyzwalanie i przechwytywanie zdarzeń w trakcie wykonania

W tym przykładzie, gdy opóźnione zdarzenia są włączone, zawsze zwracana jest wartość false, ponieważ funkcja zwrotna nie została uruchomiona. Aby działać poprawnie, wątek musi wstrzymać działanie przynajmniej do momentu, kiedy zdarzenie powinno zostać wyzwolone.


local success = false
event:Connect(function ()
success = true
end)
doSomethingToTriggerEvent() -- Sprawia, że `event` jest wyzwalane
return success

Słuchanie pierwszego wystąpienia zdarzenia


connection = event:Connect(function ()
connection:Disconnect()
-- zrób coś
end)

Przy włączonych opóźnionych zdarzeniach, wielokrotne wywołania obsługi zdarzeń mogą być dodawane do kolejki, zanim rozłączysz się z zdarzeniem. Wywołanie Disconnect() anuluje wszystkie oczekujące wywołania obsługi zdarzeń—zachowanie, które istnieje również dla zdarzeń natychmiastowych.

Alternatywnie, użyj Once() jako bardziej wygodnej metody łączenia z zdarzeniem, które potrzebujesz tylko przy pierwszym wywołaniu.

Zdarzenia, które zmieniają przynależność lub właściwości

Opóźnione zdarzenia powodują, że zdarzenia zajmujące się zmianą przynależności lub właściwości uruchamiają się po tym, jak przynależność lub właściwość zostanie zmieniona:


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

Ponieważ Destroy() działa natychmiast po tym, jak skrypt, który go wywołał, wstrzymuje działanie, instancja została już zniszczona w momencie wywołania onPartDestroying(). Dla więcej przykładów, zobacz Instance.Destroying.

©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.