1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00
This commit is contained in:
sfan5 2025-06-16 12:17:32 +02:00
parent f7223129af
commit 90b80d52a8
3 changed files with 31 additions and 34 deletions

View file

@ -739,14 +739,17 @@ core.noneitemdef_default = { -- This is used for the hand and unknown items
-- get_node implementation -- get_node implementation
-- --
local get_node_raw = core.get_node_raw
local get_name_from_content_id = core.get_name_from_content_id
function core.get_node(pos) function core.get_node(pos)
local content, param1, param2 = core.get_node_raw(pos.x, pos.y, pos.z) local content, param1, param2 = get_node_raw(pos.x, pos.y, pos.z)
return {name = core.get_name_from_content_id(content), param1 = param1, param2 = param2} return {name = get_name_from_content_id(content), param1 = param1, param2 = param2}
end end
function core.get_node_or_nil(pos) function core.get_node_or_nil(pos)
local content, param1, param2, pos_ok = core.get_node_raw(pos.x, pos.y, pos.z) local content, param1, param2, pos_ok = get_node_raw(pos.x, pos.y, pos.z)
return pos_ok and return pos_ok and
{name = core.get_name_from_content_id(content), param1 = param1, param2 = param2} {name = get_name_from_content_id(content), param1 = param1, param2 = param2}
or nil or nil
end end

View file

@ -6482,10 +6482,10 @@ Environment access
* Same as `get_node` but returns `nil` for unloaded areas. * Same as `get_node` but returns `nil` for unloaded areas.
* Note that even loaded areas can contain "ignore" nodes. * Note that even loaded areas can contain "ignore" nodes.
* `core.get_node_raw(x, y, z)` * `core.get_node_raw(x, y, z)`
* Low-level API returning numbers, not tables * Same as `get_node` but a faster low-level API
* Returns `content_id`, `param1`, `param2`, and `pos_ok` * Returns `content_id`, `param1`, `param2`, and `pos_ok`
* The `content_id` can be mapped to a node name via `core.get_name_from_content_id` * The `content_id` can be mapped to a name using `core.get_name_from_content_id()`
* If `pos_ok` is false, the node is not yet loaded and the `content_id` is that of "ignore" nodes * If `pos_ok` is false, the area is unloaded and `content_id == core.CONTENT_IGNORE`
* `core.get_node_light(pos[, timeofday])` * `core.get_node_light(pos[, timeofday])`
* Gets the light value at the given position. Note that the light value * Gets the light value at the given position. Note that the light value
"inside" the node at the given position is returned, so you usually want "inside" the node at the given position is returned, so you usually want

View file

@ -116,6 +116,7 @@ core.register_chatcommand("bench_bulk_set_node", {
((middle_time - start_time)) / 1000, ((middle_time - start_time)) / 1000,
((end_time - middle_time)) / 1000 ((end_time - middle_time)) / 1000
) )
print(msg)
return true, msg return true, msg
end, end,
}) })
@ -131,14 +132,11 @@ core.register_chatcommand("bench_bulk_get_node", {
local pos_list = get_positions_cube(player:get_pos()) local pos_list = get_positions_cube(player:get_pos())
local function bench() local function bench()
local start_time = core.get_us_time() local start_time = core.get_us_time()
local dummy = 0
for i=1,#pos_list do for i=1,#pos_list do
local n = core.get_node(pos_list[i]) local n = core.get_node(pos_list[i])
-- Make sure the name lookup is never optimized away. -- Make sure the name lookup is not optimized away
-- Table allocation might still be omitted. But only accessing dummy = dummy + #n.name
-- the name of a node is a common pattern anyways.
if n.name == "benchmarks:nonexistent_node" then
error("should never happen")
end
end end
return core.get_us_time() - start_time return core.get_us_time() - start_time
end end
@ -151,11 +149,12 @@ core.register_chatcommand("bench_bulk_get_node", {
local msg = string.format("Benchmark results: core.get_node loop 1: %.2f ms", local msg = string.format("Benchmark results: core.get_node loop 1: %.2f ms",
result_us / 1000) result_us / 1000)
print(msg)
return true, msg return true, msg
end, end,
}) })
core.register_chatcommand("bench_bulk_swap_node", { core.register_chatcommand("bench_bulk_get_node_raw", {
params = "", params = "",
description = "Benchmark: Bulk-get 99×99×99 nodes with raw API", description = "Benchmark: Bulk-get 99×99×99 nodes with raw API",
func = function(name, param) func = function(name, param)
@ -166,15 +165,12 @@ core.register_chatcommand("bench_bulk_swap_node", {
local pos_list = get_positions_cube(player:get_pos()) local pos_list = get_positions_cube(player:get_pos())
local function bench() local function bench()
local start_time = core.get_us_time() local start_time = core.get_us_time()
local dummy = 0
for i=1,#pos_list do for i=1,#pos_list do
local pos_i = pos_list[i] local pos_i = pos_list[i]
local nid = core.get_node_raw(pos_i.x, pos_i.y, pos_i.z) local nid = core.get_node_raw(pos_i.x, pos_i.y, pos_i.z)
-- Make sure the name lookup is never optimized away. -- Make sure the result is not optimized away
-- Table allocation might still be omitted. But only accessing dummy = dummy + nid
-- the name of a node is a common pattern anyways.
if nid == -42 then
error("should never happen")
end
end end
return core.get_us_time() - start_time return core.get_us_time() - start_time
end end
@ -187,11 +183,12 @@ core.register_chatcommand("bench_bulk_swap_node", {
local msg = string.format("Benchmark results: core.get_node_raw loop 1: %.2f ms", local msg = string.format("Benchmark results: core.get_node_raw loop 1: %.2f ms",
result_us / 1000) result_us / 1000)
print(msg)
return true, msg return true, msg
end, end,
}) })
core.register_chatcommand("bench_bulk_get_node_raw_lookup", { core.register_chatcommand("bench_bulk_get_node_raw2", {
params = "", params = "",
description = "Benchmark: Bulk-get 99×99×99 nodes with raw API and lookup names", description = "Benchmark: Bulk-get 99×99×99 nodes with raw API and lookup names",
func = function(name, param) func = function(name, param)
@ -202,16 +199,13 @@ core.register_chatcommand("bench_bulk_get_node_raw_lookup", {
local pos_list = get_positions_cube(player:get_pos()) local pos_list = get_positions_cube(player:get_pos())
local function bench() local function bench()
local start_time = core.get_us_time() local start_time = core.get_us_time()
local dummy = 0
for i=1,#pos_list do for i=1,#pos_list do
local pos_i = pos_list[i] local pos_i = pos_list[i]
local nid = core.get_node_raw(pos_i.x, pos_i.y, pos_i.z) local nid = core.get_node_raw(pos_i.x, pos_i.y, pos_i.z)
local name = core.get_name_from_content_id(nid) local name = core.get_name_from_content_id(nid)
-- Make sure the name lookup is never optimized away. -- Make sure the name lookup is not optimized away
-- Table allocation might still be omitted. But only accessing dummy = dummy + #name
-- the name of a node is a common pattern anyways.
if name == "benchmarks:nonexistent_node" then
error("should never happen")
end
end end
return core.get_us_time() - start_time return core.get_us_time() - start_time
end end
@ -224,11 +218,12 @@ core.register_chatcommand("bench_bulk_get_node_raw_lookup", {
local msg = string.format("Benchmark results: core.get_node_raw+get_name_from_content_id loop 1: %.2f ms", local msg = string.format("Benchmark results: core.get_node_raw+get_name_from_content_id loop 1: %.2f ms",
result_us / 1000) result_us / 1000)
print(msg)
return true, msg return true, msg
end, end,
}) })
core.register_chatcommand("bench_bulk_get_node_vmanip", { core.register_chatcommand("bench_bulk_get_node_vm", {
params = "", params = "",
description = "Benchmark: Bulk-get 99×99×99 nodes with voxel manipulator", description = "Benchmark: Bulk-get 99×99×99 nodes with voxel manipulator",
func = function(name, param) func = function(name, param)
@ -242,14 +237,11 @@ core.register_chatcommand("bench_bulk_get_node_vmanip", {
local vm = core.get_voxel_manip(pos:offset(1,1,1), pos:offset(100,100,100)) local vm = core.get_voxel_manip(pos:offset(1,1,1), pos:offset(100,100,100))
local data = vm:get_data() local data = vm:get_data()
local mid_time = core.get_us_time() local mid_time = core.get_us_time()
local dummy = 0
for i=1,99*99*99 do for i=1,99*99*99 do
local nid = data[i] local nid = data[i]
-- Make sure the name lookup is never optimized away. -- Make sure the table lookup is not optimized away
-- Table allocation might still be omitted. But only accessing dummy = dummy + nid
-- the name of a node is a common pattern anyways.
if nid == -42 then
error("should never happen")
end
end end
return core.get_us_time() - start_time, mid_time - start_time return core.get_us_time() - start_time, mid_time - start_time
end end
@ -262,6 +254,7 @@ core.register_chatcommand("bench_bulk_get_node_vmanip", {
local msg = string.format("Benchmark results: core.get_voxel_vmanip+get_data+loop loop 1: %.2f ms of which get_data() %.2f ms", local msg = string.format("Benchmark results: core.get_voxel_vmanip+get_data+loop loop 1: %.2f ms of which get_data() %.2f ms",
result_us / 1000, get_data_us / 1000) result_us / 1000, get_data_us / 1000)
print(msg)
return true, msg return true, msg
end, end,
}) })
@ -295,6 +288,7 @@ core.register_chatcommand("bench_bulk_swap_node", {
((middle_time - start_time)) / 1000, ((middle_time - start_time)) / 1000,
((end_time - middle_time)) / 1000 ((end_time - middle_time)) / 1000
) )
print(msg)
return true, msg return true, msg
end, end,
}) })