Skip to content

Commit

Permalink
Optimize core.after in a simple way (#8351)
Browse files Browse the repository at this point in the history
  • Loading branch information
Desour authored and sfan5 committed Mar 27, 2019
1 parent 42e1a12 commit ad75dba
Showing 1 changed file with 13 additions and 5 deletions.
18 changes: 13 additions & 5 deletions builtin/common/after.lua
@@ -1,33 +1,41 @@
local jobs = {}
local time = 0.0
local time_next = math.huge

core.register_globalstep(function(dtime)
time = time + dtime

if #jobs < 1 then
if time < time_next then
return
end

time_next = math.huge

-- Iterate backwards so that we miss any new timers added by
-- a timer callback, and so that we don't skip the next timer
-- in the list if we remove one.
-- a timer callback.
for i = #jobs, 1, -1 do
local job = jobs[i]
if time >= job.expire then
core.set_last_run_mod(job.mod_origin)
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)

function core.after(after, func, ...)
assert(tonumber(after) and type(func) == "function",
"Invalid minetest.after invocation")
local expire = time + after
jobs[#jobs + 1] = {
func = func,
expire = time + after,
expire = expire,
arg = {...},
mod_origin = core.get_last_run_mod()
}
time_next = math.min(time_next, expire)
end

0 comments on commit ad75dba

Please sign in to comment.