diff options
author | BuckarooBanzay <BuckarooBanzay@users.noreply.github.com> | 2020-05-04 10:03:45 +0200 |
---|---|---|
committer | BuckarooBanzay <BuckarooBanzay@users.noreply.github.com> | 2020-05-04 10:03:45 +0200 |
commit | 17915aa4c5d17ccdbc2f1d68e98d66cd0a945092 (patch) | |
tree | 632f3f7636097cf6a1c8303fc53d8f33d67f2814 /context.lua | |
parent | a6c03a3206527a00385c4b7d05ec2de3f2747e15 (diff) | |
download | mesecons_debug-17915aa4c5d17ccdbc2f1d68e98d66cd0a945092.tar.gz mesecons_debug-17915aa4c5d17ccdbc2f1d68e98d66cd0a945092.zip |
modernize a bit
Diffstat (limited to 'context.lua')
-rw-r--r-- | context.lua | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/context.lua b/context.lua new file mode 100644 index 0000000..1bdb338 --- /dev/null +++ b/context.lua @@ -0,0 +1,83 @@ +local has_monitoring = minetest.get_modpath("monitoring") + +local mapblock_count, penalized_mapblock_count + +if has_monitoring then + mapblock_count = monitoring.gauge("mesecons_debug_mapblock_count", "count of tracked mapblocks") + penalized_mapblock_count = monitoring.gauge("mesecons_debug_penalized_mapblock_count", "count of penalized mapblocks") +end + +local function get_blockpos(pos) + return {x = math.floor(pos.x / 16), + y = math.floor(pos.y / 16), + z = math.floor(pos.z / 16)} +end + +-- blockpos-hash => context +local context_store = {} + +mesecons_debug.get_context = function(pos) + local blockpos = get_blockpos(pos) + local hash = minetest.hash_node_position(blockpos) + + local ctx = context_store[hash] + if not ctx then + -- create a new context + ctx = { + -- usage in us + micros = 0, + -- average micros per second + avg_micros = 0, + -- time penalty + penalty = 0, + + -- mtime + mtime = minetest.get_us_time(), + } + context_store[hash] = ctx + end + + return ctx +end + +local timer = 0 +minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer < 1 then return end + timer=0 + + local penalized_count = 0 + local now = minetest.get_us_time() + local cleanup_time_micros = 300 * 1000 * 1000 + + mesecons_debug.context_store_size = 0 + for hash, ctx in pairs(context_store) do + local time_diff = now - ctx.mtime + if time_diff > cleanup_time_micros then + -- remove item + context_store[hash] = nil + + else + -- calculate stuff + ctx.avg_micros = math.floor((ctx.avg_micros * 0.9) + (ctx.micros * 0.1)) + ctx.micros = 0 + if ctx.avg_micros > mesecons_debug.max_usage_micros then + -- add penalty + ctx.penalty = math.min(ctx.penalty + 0.1, 20) + elseif ctx.penalty > 0 then + -- remove penalty (slowly) + ctx.penalty = math.max(ctx.penalty - 0.01, 0) + end + + mesecons_debug.context_store_size = mesecons_debug.context_store_size + 1 + if ctx.penalty > 0 then + penalized_count = penalized_count + 1 + end + + end + end + + mapblock_count.set(mesecons_debug.context_store_size) + penalized_mapblock_count.set(penalized_count) + +end) |