开发者们,大家好!
我们刚刚启用了一个全新的库,可以运用到你们的项目中。任务库可让你直接与引擎的任务计划程序交流来管理并计划代码。它包含了数个算法,以及对一些现有算法的改进。
详情
task.spawn
接受一个线程或函数,并立即通过引擎的计划程序继续任务。额外的参数将传递给继续的线程或函数。
void task.spawn(function | thread, ...args)
这在调用可能在迭代一组对象时暂停的函数时非常有用:
local function playerAdded(player)
...
(yield)
end
for _, player in ipairs(Players:GetPlayers()) do
task.spawn(playerAdded, player)
end
task.spawn 是基于 fastSpawn 模式,而不是作为 spawn 186 的替代品。我们建议你在应该使用 fastSpawn 场合使用此算法。
task.defer
接受一个线程或函数并推迟它直到 resumption cycle 244,然后用引擎的计划程序继续。额外的参数将传递给继续的线程或函数。
void task.defer(function | thread, ...args)
当你想获得类似 task.spawn 的行为,但不在乎线程立即运行的时候使用它。
task.defer(print, "A")
print("B")
--> B
--> A
task.defer 是 spawn 186 的改进版,它计划一个线程尽快继续(担不是立即继续)而不进行任何限流。
task.delay
接受一个线程或函数并计划它在指定时间后的下一个 Heartbeat 69 步继续。进程以内置的错误处理程序继续,并支持其他引擎功能。额外的参数将传递给继续的线程或函数。
void task.delay(duration, function | thread, ...args)
实际的延迟时间会有变化,可以通过传递当前时间作为参数来计算得出。
task.delay(2, function (scheduledTime)
print(os.clock() - scheduledTime) --> 2.038702
end, os.clock())
时长为零时会使线程或函数在下一步时继续。
task.delay 是 delay 21的改进版,它计划一个线程在一定时间后继续而不进行任何限流。
task.wait
暂停当前线程,直到经过指定时间(以秒计算),然后在下一个 Heartbeat 69步时继续线程。
elapsed task.wait(duration=0)
实际暂停时间会有变化,出于方便此算法会返回实际暂停时间。
local elapsedTime = task.wait(2) -- wait for 2 seconds
print(elapsedTime) --> 2.0792941
如果不指定时长则默认为零,也就是说线程会在下一步自动继续。
task.wait()
-- 行为与 RunService.Heartbeat:Wait() 一致
RunService.Heartbeat:Wait()
task.wait 是 wait 109的改进版,它它计划一个线程在一定时间后继续而不进行任何限流。
现有算法
我们最终会将现有算法(spawn,delay 和 wait)标为已弃用,但将来它们仍会继续生效,我们也没有改变的计划。