mirror of
				https://github.com/Ukendio/jecs.git
				synced 2025-11-04 02:49:18 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			160 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Text
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Text
		
	
	
		
			Executable file
		
	
	
	
	
local jecs = require("@jecs")
 | 
						|
local mirror = require("@mirror")
 | 
						|
 | 
						|
type i53 = number
 | 
						|
 | 
						|
do
 | 
						|
	TITLE(testkit.color.white_underline("Jecs query"))
 | 
						|
	local ecs = jecs.World.new()
 | 
						|
	do
 | 
						|
		TITLE("one component in common")
 | 
						|
 | 
						|
		local function view_bench(world: jecs.World, A: i53, B: i53, C: i53, D: i53, E: i53, F: i53, G: i53, H: i53)
 | 
						|
			BENCH("4 component", function()
 | 
						|
				for _ in world:query(D, C, B, A) do
 | 
						|
				end
 | 
						|
			end)
 | 
						|
		end
 | 
						|
 | 
						|
		local D1 = ecs:component()
 | 
						|
		local D2 = ecs:component()
 | 
						|
		local D3 = ecs:component()
 | 
						|
		local D4 = ecs:component()
 | 
						|
		local D5 = ecs:component()
 | 
						|
		local D6 = ecs:component()
 | 
						|
		local D7 = ecs:component()
 | 
						|
		local D8 = ecs:component()
 | 
						|
 | 
						|
		local function flip()
 | 
						|
			return math.random() >= 0.15
 | 
						|
		end
 | 
						|
 | 
						|
		local added = 0
 | 
						|
		local archetypes = {}
 | 
						|
		for i = 1, 2 ^ 16 - 2 do
 | 
						|
			local entity = ecs:entity()
 | 
						|
 | 
						|
			local combination = ""
 | 
						|
 | 
						|
			if flip() then
 | 
						|
				combination ..= "B"
 | 
						|
				ecs:set(entity, D2, { value = true })
 | 
						|
			end
 | 
						|
			if flip() then
 | 
						|
				combination ..= "C"
 | 
						|
				ecs:set(entity, D3, { value = true })
 | 
						|
			end
 | 
						|
			if flip() then
 | 
						|
				combination ..= "D"
 | 
						|
				ecs:set(entity, D4, { value = true })
 | 
						|
			end
 | 
						|
			if flip() then
 | 
						|
				combination ..= "E"
 | 
						|
				ecs:set(entity, D5, { value = true })
 | 
						|
			end
 | 
						|
			if flip() then
 | 
						|
				combination ..= "F"
 | 
						|
				ecs:set(entity, D6, { value = true })
 | 
						|
			end
 | 
						|
			if flip() then
 | 
						|
				combination ..= "G"
 | 
						|
				ecs:set(entity, D7, { value = true })
 | 
						|
			end
 | 
						|
			if flip() then
 | 
						|
				combination ..= "H"
 | 
						|
				ecs:set(entity, D8, { value = true })
 | 
						|
			end
 | 
						|
 | 
						|
			if #combination == 7 then
 | 
						|
				added += 1
 | 
						|
				ecs:set(entity, D1, { value = true })
 | 
						|
			end
 | 
						|
			archetypes[combination] = true
 | 
						|
		end
 | 
						|
 | 
						|
		local a = 0
 | 
						|
		for _ in archetypes do
 | 
						|
			a += 1
 | 
						|
		end
 | 
						|
 | 
						|
		view_bench(ecs, D1, D2, D3, D4, D5, D6, D7, D8)
 | 
						|
	end
 | 
						|
end
 | 
						|
 | 
						|
do
 | 
						|
	TITLE(testkit.color.white_underline("Mirror query"))
 | 
						|
	local ecs = mirror.World.new()
 | 
						|
	do
 | 
						|
		TITLE("one component in common")
 | 
						|
 | 
						|
		local function view_bench(world: jecs.World, A: i53, B: i53, C: i53, D: i53, E: i53, F: i53, G: i53, H: i53)
 | 
						|
			BENCH("4 component", function()
 | 
						|
				for _ in world:query(D, C, B, A) do
 | 
						|
				end
 | 
						|
			end)
 | 
						|
		end
 | 
						|
 | 
						|
		local D1 = ecs:component()
 | 
						|
		local D2 = ecs:component()
 | 
						|
		local D3 = ecs:component()
 | 
						|
		local D4 = ecs:component()
 | 
						|
		local D5 = ecs:component()
 | 
						|
		local D6 = ecs:component()
 | 
						|
		local D7 = ecs:component()
 | 
						|
		local D8 = ecs:component()
 | 
						|
 | 
						|
		local function flip()
 | 
						|
			return math.random() >= 0.15
 | 
						|
		end
 | 
						|
 | 
						|
		local added = 0
 | 
						|
		local archetypes = {}
 | 
						|
		for i = 1, 2 ^ 16 - 2 do
 | 
						|
			local entity = ecs:entity()
 | 
						|
 | 
						|
			local combination = ""
 | 
						|
 | 
						|
			if flip() then
 | 
						|
				combination ..= "B"
 | 
						|
				ecs:set(entity, D2, { value = true })
 | 
						|
			end
 | 
						|
			if flip() then
 | 
						|
				combination ..= "C"
 | 
						|
				ecs:set(entity, D3, { value = true })
 | 
						|
			end
 | 
						|
			if flip() then
 | 
						|
				combination ..= "D"
 | 
						|
				ecs:set(entity, D4, { value = true })
 | 
						|
			end
 | 
						|
			if flip() then
 | 
						|
				combination ..= "E"
 | 
						|
				ecs:set(entity, D5, { value = true })
 | 
						|
			end
 | 
						|
			if flip() then
 | 
						|
				combination ..= "F"
 | 
						|
				ecs:set(entity, D6, { value = true })
 | 
						|
			end
 | 
						|
			if flip() then
 | 
						|
				combination ..= "G"
 | 
						|
				ecs:set(entity, D7, { value = true })
 | 
						|
			end
 | 
						|
			if flip() then
 | 
						|
				combination ..= "H"
 | 
						|
				ecs:set(entity, D8, { value = true })
 | 
						|
			end
 | 
						|
 | 
						|
			if #combination == 7 then
 | 
						|
				added += 1
 | 
						|
				ecs:set(entity, D1, { value = true })
 | 
						|
			end
 | 
						|
			archetypes[combination] = true
 | 
						|
		end
 | 
						|
 | 
						|
		local a = 0
 | 
						|
		for _ in archetypes do
 | 
						|
			a += 1
 | 
						|
		end
 | 
						|
 | 
						|
		view_bench(ecs, D1, D2, D3, D4, D5, D6, D7, D8)
 | 
						|
	end
 | 
						|
end
 |