mirror of
https://github.com/BlackMATov/evolved.lua.git
synced 2025-12-16 14:11:16 +07:00
273 lines
6.6 KiB
Lua
273 lines
6.6 KiB
Lua
local evo = require 'evolved.evolved'
|
|
|
|
---@param name string
|
|
---@param loop fun(...): ...
|
|
---@param init fun(): ...
|
|
local function describe(name, loop, init)
|
|
collectgarbage('stop')
|
|
|
|
print(string.format('| %s ... |', name))
|
|
|
|
local state = evo.compat.pack(init())
|
|
|
|
local iters = 0
|
|
local start_s = os.clock()
|
|
local start_kb = collectgarbage('count')
|
|
|
|
local success, result = pcall(function()
|
|
while os.clock() - start_s < 1.0 do
|
|
iters = iters + 1
|
|
loop(evo.compat.unpack(state))
|
|
end
|
|
end)
|
|
|
|
local finish_s = os.clock()
|
|
local finish_kb = collectgarbage('count')
|
|
|
|
print(string.format(' %s | us: %.2f | op/s: %.2f | kb/i: %.2f',
|
|
success and 'OK' or 'FAILED',
|
|
(finish_s - start_s) * 1000 * 1000 / iters,
|
|
iters / (finish_s - start_s),
|
|
(finish_kb - start_kb) / iters))
|
|
|
|
if not success then print(' ' .. result) end
|
|
|
|
collectgarbage('restart')
|
|
end
|
|
|
|
---@param a evolved.entity
|
|
---@param b evolved.entity
|
|
---@param c evolved.entity
|
|
---@param d evolved.entity
|
|
---@param e evolved.entity
|
|
---@param A evolved.query
|
|
---@param AB evolved.query
|
|
---@param ABC evolved.query
|
|
---@param ABCD evolved.query
|
|
---@param ABCDE evolved.query
|
|
describe('Packed Iteration', function(a, b, c, d, e, A, AB, ABC, ABCD, ABCDE)
|
|
for chunk in A:execute() do
|
|
local as = chunk:components(a)
|
|
for i = 1, #chunk:entities() do
|
|
as[i] = as[i] * 2
|
|
end
|
|
end
|
|
|
|
for chunk in AB:execute() do
|
|
local bs = chunk:components(b)
|
|
for i = 1, #chunk:entities() do
|
|
bs[i] = bs[i] * 2
|
|
end
|
|
end
|
|
|
|
for chunk in ABC:execute() do
|
|
local cs = chunk:components(c)
|
|
for i = 1, #chunk:entities() do
|
|
cs[i] = cs[i] * 2
|
|
end
|
|
end
|
|
|
|
for chunk in ABCD:execute() do
|
|
local ds = chunk:components(d)
|
|
for i = 1, #chunk:entities() do
|
|
ds[i] = ds[i] * 2
|
|
end
|
|
end
|
|
|
|
for chunk in ABCDE:execute() do
|
|
local es = chunk:components(e)
|
|
for i = 1, #chunk:entities() do
|
|
es[i] = es[i] * 2
|
|
end
|
|
end
|
|
end, function()
|
|
local A, B, C, D, E =
|
|
evo.registry.entity(),
|
|
evo.registry.entity(),
|
|
evo.registry.entity(),
|
|
evo.registry.entity(),
|
|
evo.registry.entity()
|
|
|
|
for _ = 1, 1000 do
|
|
evo.registry.entity():set(A, 0):set(B, 0):set(C, 0):set(D, 0):set(E, 0)
|
|
end
|
|
|
|
return
|
|
A, B, C, D, E,
|
|
evo.registry.query(A),
|
|
evo.registry.query(A, B),
|
|
evo.registry.query(A, B, C),
|
|
evo.registry.query(A, B, C, D),
|
|
evo.registry.query(A, B, C, D, E)
|
|
end)
|
|
|
|
describe('Simple Iteration', function(a, b, c, d, e, AB, CD, CE)
|
|
for chunk in AB:execute() do
|
|
local as = chunk:components(a)
|
|
local bs = chunk:components(b)
|
|
for i = 1, #chunk:entities() do
|
|
as[i], bs[i] = bs[i], as[i]
|
|
end
|
|
end
|
|
|
|
for chunk in CD:execute() do
|
|
local cs = chunk:components(c)
|
|
local ds = chunk:components(d)
|
|
for i = 1, #chunk:entities() do
|
|
cs[i], ds[i] = ds[i], cs[i]
|
|
end
|
|
end
|
|
|
|
for chunk in CE:execute() do
|
|
local cs = chunk:components(c)
|
|
local es = chunk:components(e)
|
|
for i = 1, #chunk:entities() do
|
|
cs[i], es[i] = es[i], cs[i]
|
|
end
|
|
end
|
|
end, function()
|
|
local A, B, C, D, E =
|
|
evo.registry.entity(),
|
|
evo.registry.entity(),
|
|
evo.registry.entity(),
|
|
evo.registry.entity(),
|
|
evo.registry.entity()
|
|
|
|
for _ = 1, 1000 do
|
|
evo.registry.entity():set(A, 0):set(B, 0)
|
|
evo.registry.entity():set(A, 0):set(B, 0):set(C, 0)
|
|
evo.registry.entity():set(A, 0):set(B, 0):set(C, 0):set(D, 0)
|
|
evo.registry.entity():set(A, 0):set(B, 0):set(C, 0):set(E, 0)
|
|
end
|
|
|
|
return A, B, C, D, E,
|
|
evo.registry.query(A, B),
|
|
evo.registry.query(C, D),
|
|
evo.registry.query(C, E)
|
|
end)
|
|
|
|
---@param d evolved.entity
|
|
---@param z evolved.entity
|
|
---@param D evolved.query
|
|
---@param Z evolved.query
|
|
describe('Fragmented Iteration', function(d, z, D, Z)
|
|
for chunk in D:execute() do
|
|
local ds = chunk:components(d)
|
|
for i = 1, #chunk:entities() do
|
|
ds[i] = ds[i] * 2
|
|
end
|
|
end
|
|
|
|
for chunk in Z:execute() do
|
|
local zs = chunk:components(z)
|
|
for i = 1, #chunk:entities() do
|
|
zs[i] = zs[i] * 2
|
|
end
|
|
end
|
|
end, function()
|
|
local cs, d = {}, evo.registry.entity()
|
|
for i = 1, 26 do cs[i] = evo.registry.entity() end
|
|
|
|
for i = 1, #cs do
|
|
for _ = 1, 100 do
|
|
evo.registry.entity():set(cs[i], 0):set(d, 0)
|
|
end
|
|
end
|
|
|
|
return d, cs[#cs],
|
|
evo.registry.query(d),
|
|
evo.registry.query(cs[#cs])
|
|
end)
|
|
|
|
---@param a evolved.entity
|
|
---@param b evolved.entity
|
|
---@param A evolved.query
|
|
---@param B evolved.query
|
|
describe('Entity Cycle', function(a, b, A, B)
|
|
---@type any[]
|
|
local to_create = {}
|
|
|
|
for chunk in A:execute() do
|
|
local as = chunk:components(a)
|
|
for i = 1, #chunk:entities() do
|
|
to_create[#to_create + 1] = as[i]
|
|
end
|
|
end
|
|
|
|
for i = 1, #to_create do
|
|
evo.registry.entity():set(b, to_create[i])
|
|
end
|
|
|
|
---@type evolved.entity[]
|
|
local to_destroy = {}
|
|
|
|
for chunk in B:execute() do
|
|
local es = chunk:entities()
|
|
for i = 1, #es do
|
|
to_destroy[#to_destroy + 1] = es[i]
|
|
end
|
|
end
|
|
|
|
for i = 1, #to_destroy do
|
|
evo.registry.destroy(to_destroy[i])
|
|
end
|
|
end, function()
|
|
local a, b =
|
|
evo.registry.entity(),
|
|
evo.registry.entity()
|
|
|
|
for _ = 1, 1000 do
|
|
evo.registry.entity():set(a, 0)
|
|
end
|
|
|
|
return a, b,
|
|
evo.registry.query(a),
|
|
evo.registry.query(b)
|
|
end)
|
|
|
|
---@param a evolved.entity
|
|
---@param b evolved.entity
|
|
---@param A evolved.query
|
|
---@param AB evolved.query
|
|
describe('Add / Remove', function(a, b, A, AB)
|
|
---@type evolved.entity[]
|
|
local to_change = {}
|
|
|
|
for chunk in A:execute() do
|
|
local es = chunk:entities()
|
|
for i = 1, #es do
|
|
to_change[#to_change + 1] = es[i]
|
|
end
|
|
end
|
|
|
|
for i = 1, #to_change do
|
|
to_change[i]:set(b)
|
|
end
|
|
|
|
---@type evolved.entity[]
|
|
local to_remove = {}
|
|
|
|
for chunk in AB:execute() do
|
|
local es = chunk:entities()
|
|
for i = 1, #es do
|
|
to_remove[#to_remove + 1] = es[i]
|
|
end
|
|
end
|
|
|
|
for i = 1, #to_remove do
|
|
to_remove[i]:remove(b)
|
|
end
|
|
end, function()
|
|
local a, b =
|
|
evo.registry.entity(),
|
|
evo.registry.entity()
|
|
|
|
for _ = 1, 1000 do
|
|
evo.registry.entity():set(a)
|
|
end
|
|
|
|
return a, b,
|
|
evo.registry.query(a),
|
|
evo.registry.query(b)
|
|
end)
|