Перейти к содержимому

Scheduler

Scheduler запускает callback каждый кадр, каждый серверный тик или один раз после задержки.

Планировщик сам ничего не рисует и не меняет в игре: видимый или игровой эффект определяется кодом внутри callback. OnFrame() подходит для клиентской отрисовки и плавного обновления UI, OnTick() — для серверных решений, а Schedule() — для одноразовой задержки в текущем контексте.

  • OnFrame() хранит подписку в клиентском runtime модуля и вызывает её из цикла отрисовки. Частота зависит от FPS, а не от серверного tickrate.
  • OnTick() хранит подписку в Reflex server runtime и вызывает её один раз за серверный тик модуля.
  • Schedule() помещает одноразовый callback в очередь текущего runtime; по истечении задержки очередь вызывает функцию в том же client/server-контексте.
  • EventSubscription:Cancel() удаляет повторяющийся callback из этой очереди. Он не откатывает уже выполненные изменения.
Метод Обычный модуль / Reflex main.lua Reflex server.lua
OnFrame
OnTick
Schedule

Ограничения строгие: недоступный метод отсутствует в Lua-объекте. Вызов OnTick на клиенте или OnFrame на сервере останавливает выполнение Lua access error.

Scheduler:OnFrame(callback: function): EventSubscription

Вызывает callback каждый отрисованный кадр. Метод доступен только в клиентской Lua-части.

local subscription
local frames = 0
subscription = Scheduler:OnFrame(function()
frames = frames + 1
if frames >= 60 then
subscription:Cancel()
end
end)

Частота OnFrame зависит от частоты кадров. Не используйте количество кадров как таймер в секундах — сравнивайте Time.Seconds или применяйте Schedule().

Scheduler:OnTick(callback: function): EventSubscription

Вызывает callback каждый тик симуляции. Метод доступен только в server.lua Reflex-модуля.

local subscription
local ticks = 0
subscription = Scheduler:OnTick(function()
ticks = ticks + 1
if ticks >= 30 then
subscription:Cancel()
end
end)

В проверке 30 последовательных callback-ов соответствовали 30 тикам и 0.5 секунды симуляции.

OnFrame() и OnTick() возвращают объект подписки.

subscription:Cancel()

Отменяет подписку. После вызова её callback больше не выполняется.

Сохраняйте возвращённый объект, если callback должен когда-либо остановиться:

local subscription = Scheduler:OnFrame(Update)
-- Позже
subscription:Cancel()
Scheduler:Schedule(duration: number, callback: function)

Планирует один вызов callback через указанное число секунд. Доступен в обоих Lua-контекстах.

Scheduler:Schedule(1, function()
print("One second has passed")
end)

Метод возвращает nil, а callback вызывается только один раз. Объект EventSubscription для такого вызова не создаётся.

Schedule() выполняет callback на ближайшем последующем обновлении, поэтому фактическая задержка может быть немного больше указанной.

Для Schedule(0.1, callback) было получено:

Контекст Фактическая задержка
Client около 0.1064 секунды
Reflex server около 0.1167 секунды, 7 тиков

Используйте метод для игровой логики и интерфейса, но не ожидайте точности высокочастотного таймера.

Scheduler:Schedule(0, nil)

Такой вызов принимается без ошибки и ничего не делает.

OnTick не является клиентским методом. Перенесите логику в server.lua Reflex-модуля либо используйте OnFrame.

Сервер не отрисовывает кадры. Используйте OnTick.

Без сохранённого EventSubscription код не сможет вызвать Cancel(). Присвойте результат OnFrame() или OnTick() переменной.

Schedule() возвращает nil. Если нужна отменяемая задержка, реализуйте проверку времени внутри OnFrame или OnTick и отмените эту подписку после выполнения.