diff options
author | DS <vorunbekannt75@web.de> | 2019-03-27 21:05:50 +0100 |
---|---|---|
committer | sfan5 <sfan5@live.de> | 2019-03-27 21:05:50 +0100 |
commit | ad75dba87bb39de2c3d12b228bf113abe740c942 (patch) | |
tree | d8b96391d2d3ba7b5eba56aa60e0e9c7f7dfb37f /builtin | |
parent | 42e1a127140965cac1be6e51e48192e341c2a29e (diff) | |
download | minetest-ad75dba87bb39de2c3d12b228bf113abe740c942.tar.gz minetest-ad75dba87bb39de2c3d12b228bf113abe740c942.tar.bz2 minetest-ad75dba87bb39de2c3d12b228bf113abe740c942.zip |
Optimize core.after in a simple way (#8351)
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/common/after.lua | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/builtin/common/after.lua b/builtin/common/after.lua index 1bed2d31f..b314711c9 100644 --- a/builtin/common/after.lua +++ b/builtin/common/after.lua @@ -1,22 +1,28 @@ 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) @@ -24,10 +30,12 @@ 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 |