Optimize core.after in a simple way (#8351)
This commit is contained in:
parent
a623a888a7
commit
aa0ee4cc03
|
@ -1,22 +1,28 @@
|
||||||
local jobs = {}
|
local jobs = {}
|
||||||
local time = 0.0
|
local time = 0.0
|
||||||
|
local time_next = math.huge
|
||||||
|
|
||||||
core.register_globalstep(function(dtime)
|
core.register_globalstep(function(dtime)
|
||||||
time = time + dtime
|
time = time + dtime
|
||||||
|
|
||||||
if #jobs < 1 then
|
if time < time_next then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
time_next = math.huge
|
||||||
|
|
||||||
-- Iterate backwards so that we miss any new timers added by
|
-- Iterate backwards so that we miss any new timers added by
|
||||||
-- a timer callback, and so that we don't skip the next timer
|
-- a timer callback.
|
||||||
-- in the list if we remove one.
|
|
||||||
for i = #jobs, 1, -1 do
|
for i = #jobs, 1, -1 do
|
||||||
local job = jobs[i]
|
local job = jobs[i]
|
||||||
if time >= job.expire then
|
if time >= job.expire then
|
||||||
core.set_last_run_mod(job.mod_origin)
|
core.set_last_run_mod(job.mod_origin)
|
||||||
job.func(unpack(job.arg))
|
job.func(unpack(job.arg))
|
||||||
table.remove(jobs, i)
|
local jobs_l = #jobs
|
||||||
|
jobs[i] = jobs[jobs_l]
|
||||||
|
jobs[jobs_l] = nil
|
||||||
|
elseif job.expire < time_next then
|
||||||
|
time_next = job.expire
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
@ -24,10 +30,12 @@ end)
|
||||||
function core.after(after, func, ...)
|
function core.after(after, func, ...)
|
||||||
assert(tonumber(after) and type(func) == "function",
|
assert(tonumber(after) and type(func) == "function",
|
||||||
"Invalid minetest.after invocation")
|
"Invalid minetest.after invocation")
|
||||||
|
local expire = time + after
|
||||||
jobs[#jobs + 1] = {
|
jobs[#jobs + 1] = {
|
||||||
func = func,
|
func = func,
|
||||||
expire = time + after,
|
expire = expire,
|
||||||
arg = {...},
|
arg = {...},
|
||||||
mod_origin = core.get_last_run_mod()
|
mod_origin = core.get_last_run_mod()
|
||||||
}
|
}
|
||||||
|
time_next = math.min(time_next, expire)
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue