aboutsummaryrefslogtreecommitdiff
path: root/builtin
diff options
context:
space:
mode:
authorHybridDog <adresse_test@t-online.de>2015-06-03 15:58:38 +0200
committerest31 <MTest31@outlook.com>2015-06-06 21:00:38 +0200
commit8383a61eac5b4702040000c7ae62895254dda40e (patch)
tree3a894ba49c8c53190bee0754cda35016d0ae2122 /builtin
parent74d8b341bc7df3a24710c3b14d39530026516686 (diff)
downloadminetest-8383a61eac5b4702040000c7ae62895254dda40e.tar.gz
minetest-8383a61eac5b4702040000c7ae62895254dda40e.tar.bz2
minetest-8383a61eac5b4702040000c7ae62895254dda40e.zip
Decrease minetest.after globalstep lag
* abort if theres no active timer * only reduce the timer.time of all timers when its necessary * move updating timers_to_add into a seperate function
Diffstat (limited to 'builtin')
-rw-r--r--builtin/game/misc.lua68
1 files changed, 50 insertions, 18 deletions
diff --git a/builtin/game/misc.lua b/builtin/game/misc.lua
index a71d5d02a..7fa95742e 100644
--- a/builtin/game/misc.lua
+++ b/builtin/game/misc.lua
@@ -4,40 +4,72 @@
-- Misc. API functions
--
-core.timers_to_add = {}
-core.timers = {}
-core.register_globalstep(function(dtime)
- for _, timer in ipairs(core.timers_to_add) do
- table.insert(core.timers, timer)
- end
- core.timers_to_add = {}
- local index = 1
- while index <= #core.timers do
- local timer = core.timers[index]
- timer.time = timer.time - dtime
+local timers = {}
+local mintime
+local function update_timers(delay)
+ mintime = false
+ local sub = 0
+ for index = 1, #timers do
+ index = index - sub
+ local timer = timers[index]
+ timer.time = timer.time - delay
if timer.time <= 0 then
timer.func(unpack(timer.args or {}))
- table.remove(core.timers,index)
+ table.remove(timers, index)
+ sub = sub + 1
+ elseif mintime then
+ mintime = math.min(mintime, timer.time)
else
- index = index + 1
+ mintime = timer.time
end
end
+end
+
+local timers_to_add
+local function add_timers()
+ for _, timer in ipairs(timers_to_add) do
+ table.insert(timers, timer)
+ end
+ timers_to_add = false
+end
+
+local delay = 0
+core.register_globalstep(function(dtime)
+ if not mintime then
+ -- abort if no timers are running
+ return
+ end
+ if timers_to_add then
+ add_timers()
+ end
+ delay = delay + dtime
+ if delay < mintime then
+ return
+ end
+ update_timers(delay)
+ delay = 0
end)
function core.after(time, func, ...)
assert(tonumber(time) and type(func) == "function",
"Invalid core.after invocation")
- table.insert(core.timers_to_add, {time=time, func=func, args={...}})
+ if not mintime then
+ mintime = time
+ timers_to_add = {{time=time+delay, func=func, args={...}}}
+ return
+ end
+ mintime = math.min(mintime, time)
+ timers_to_add = timers_to_add or {}
+ timers_to_add[#timers_to_add+1] = {time=time+delay, func=func, args={...}}
end
function core.check_player_privs(name, privs)
local player_privs = core.get_player_privs(name)
local missing_privileges = {}
for priv, val in pairs(privs) do
- if val then
- if not player_privs[priv] then
- table.insert(missing_privileges, priv)
- end
+ if val
+ and not player_privs[priv] then
+ table.insert(missing_privileges, priv)
end
end
if #missing_privileges > 0 then