Harmonogramowanie kodu jest przydatne w wielu sytuacjach, takich jak zapewnienie, że kod zostanie wykonany po zakończeniu określonej akcji lub cyklu, lub opóźnienie kodu na określony czas. Możesz użyć biblioteki task, aby zoptymalizować harmonogramowanie zadań w Robloxie w celu zarządzania i planowania kodu. Możesz również użyć podobnej biblioteki o nazwie coroutine, aby zaplanować kod, który ma dodatkowe funkcje.
Najczęstsze metody
Poniżej znajdują się najczęstsze metody task używane do harmonogramowania kodu. Należy używać metod zadań zamiast przestarzałych metod harmonogramowania, takich jak wait(), aby zapewnić optymalne działanie kodu.
Poniższa tabela przedstawia odpowiednie przestarzałe globalne metody i ich preferowane, bardziej zoptymalizowane odpowiedniki:
| Przestarzałe globalne metody | Metody zadań | Dodatkowe alternatywy |
|---|---|---|
| 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() przyjmuje wątek lub funkcję i wznawia go natychmiastowo za pomocą harmonogramu silnika. Dodatkowe argumenty są przekazywane do wątku lub funkcji, która jest wznawiana.
Poniższy przykład kodu ilustruje, jak możesz użyć task.spawn(), gdy wywołujesz funkcję, która może powodować przejrzystość podczas iteracji przez zestaw obiektów:
local function playerAdded(player)
print(player)
end
for _, player in Players:GetPlayers() do
task.spawn(playerAdded, player)
end
task.defer()
task.defer() przyjmuje wątek lub funkcję i odkłada go do końca aktualnego punktu wznowienia w danej klatce. Dodatkowe argumenty są przekazywane do wątku lub funkcji wznawianej.
Zwykle powinieneś używać tego, gdy chcesz uzyskać zachowanie podobne do task.spawn(), ale nie zależy ci na natychmiastowym uruchomieniu wątku. Poniższy przykład kodu ilustruje, jak polecenie print() dla "A" zostanie odłożone do momentu, aż polecenie print() dla "B" zostanie wykonane:
task.defer(print, "A")print("B")--> B--> A
task.delay()
task.delay() przyjmuje wątek lub funkcję i harmonogramuje go do wznowienia po upływie zadanego czasu na następny krok Heartbeat. Wątek wznawia się z wbudowanym obsługiwaniem błędów i wsparciem dla innych funkcji silnika. Wszelkie dodatkowe argumenty są przekazywane do wątku lub funkcji wznawianej.
Ponieważ rzeczywisty czas opóźnienia może się różnić, poniższy przykład kodu ilustruje, jak możesz go obliczyć, przekazując aktualny czas jako argument:
task.delay(2, function(scheduledTime)
print(os.clock() - scheduledTime) --> 2.038702
end, os.clock())
Okres wynoszący zero spowoduje, że wątek lub funkcja wznowi się w następnym kroku.
task.wait()
task.wait() wstrzymuje bieżący wątek, aż upłynie zadany czas (w sekundach), a następnie wznowi wątek w następnym kroku Heartbeat.
Rzeczywisty czas oczekiwania może się różnić. Poniższy przykład kodu ilustruje, jak ta metoda zwraca go dla wygody:
Ponieważ rzeczywisty czas opóźnienia może się różnić, poniższy przykład kodu ilustruje, jak możesz uzyskać rzeczywisty czas, przechowując wartość zwracaną przez metodę:
local elapsedTime = task.wait(2) -- Czekaj 2 sekundyprint(elapsedTime) --> 2.0792941
Jeśli nie podano czasu trwania, czas domyślny wyniesie zero, co oznacza, że wątek automatycznie wznowi się w następnym kroku. Oznacza to, że task.wait() jest równoważne w zachowaniu z RunService.Heartbeat.