mirror of
https://github.com/BlackMATov/evolved.lua.git
synced 2025-12-13 19:48:00 +07:00
cache chunk transitions, chunk children as array
This commit is contained in:
@@ -9,5 +9,5 @@
|
|||||||
- [ ] add check inserts and removes after destroying entity
|
- [ ] add check inserts and removes after destroying entity
|
||||||
- [ ] add multi remove fragments function from entities
|
- [ ] add multi remove fragments function from entities
|
||||||
- [ ] cache matched chunks in queries
|
- [ ] cache matched chunks in queries
|
||||||
- [ ] cache transitions between chunks
|
- [x] cache transitions between chunks
|
||||||
- [ ] chunk's children should be sorted by id and stored in an array instead of a table
|
- [x] chunk's children should be stored in an array instead of a table
|
||||||
@@ -36,9 +36,11 @@ evolved_query_mt.__index = evolved_query_mt
|
|||||||
---@class evolved.chunk
|
---@class evolved.chunk
|
||||||
---@field package __parent? evolved.chunk
|
---@field package __parent? evolved.chunk
|
||||||
---@field package __fragment evolved.entity
|
---@field package __fragment evolved.entity
|
||||||
---@field package __children table<evolved.entity, evolved.chunk>
|
---@field package __children evolved.chunk[]
|
||||||
---@field package __entities evolved.entity[]
|
---@field package __entities evolved.entity[]
|
||||||
---@field package __components table<evolved.entity, any[]>
|
---@field package __components table<evolved.entity, any[]>
|
||||||
|
---@field package __with_fragment_cache table<evolved.entity, evolved.chunk>
|
||||||
|
---@field package __without_fragment_cache table<evolved.entity, evolved.chunk>
|
||||||
local evolved_chunk_mt = {}
|
local evolved_chunk_mt = {}
|
||||||
evolved_chunk_mt.__index = evolved_chunk_mt
|
evolved_chunk_mt.__index = evolved_chunk_mt
|
||||||
|
|
||||||
@@ -162,6 +164,8 @@ local function __root_chunk(fragment)
|
|||||||
__children = {},
|
__children = {},
|
||||||
__entities = {},
|
__entities = {},
|
||||||
__components = { [fragment] = {} },
|
__components = { [fragment] = {} },
|
||||||
|
__with_fragment_cache = {},
|
||||||
|
__without_fragment_cache = {},
|
||||||
}
|
}
|
||||||
|
|
||||||
setmetatable(root_chunk, evolved_chunk_mt)
|
setmetatable(root_chunk, evolved_chunk_mt)
|
||||||
@@ -183,18 +187,22 @@ local function __chunk_with_fragment(chunk, fragment)
|
|||||||
return __root_chunk(fragment)
|
return __root_chunk(fragment)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
do
|
||||||
|
local cached_chunk = chunk.__with_fragment_cache[fragment]
|
||||||
|
if cached_chunk then return cached_chunk end
|
||||||
|
end
|
||||||
|
|
||||||
if fragment.__guid == chunk.__fragment.__guid then
|
if fragment.__guid == chunk.__fragment.__guid then
|
||||||
return chunk
|
return chunk
|
||||||
end
|
end
|
||||||
|
|
||||||
if fragment.__guid < chunk.__fragment.__guid then
|
if fragment.__guid < chunk.__fragment.__guid then
|
||||||
local sibling_chunk = __chunk_with_fragment(chunk.__parent, fragment)
|
local sibling_chunk = __chunk_with_fragment(
|
||||||
return __chunk_with_fragment(sibling_chunk, chunk.__fragment)
|
__chunk_with_fragment(chunk.__parent, fragment),
|
||||||
end
|
chunk.__fragment)
|
||||||
|
chunk.__with_fragment_cache[fragment] = sibling_chunk
|
||||||
do
|
sibling_chunk.__without_fragment_cache[fragment] = chunk
|
||||||
local child_chunk = chunk.__children[fragment]
|
return sibling_chunk
|
||||||
if child_chunk then return child_chunk end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
---@type evolved.chunk
|
---@type evolved.chunk
|
||||||
@@ -204,6 +212,8 @@ local function __chunk_with_fragment(chunk, fragment)
|
|||||||
__children = {},
|
__children = {},
|
||||||
__entities = {},
|
__entities = {},
|
||||||
__components = { [fragment] = {} },
|
__components = { [fragment] = {} },
|
||||||
|
__with_fragment_cache = {},
|
||||||
|
__without_fragment_cache = {},
|
||||||
}
|
}
|
||||||
|
|
||||||
for f, _ in pairs(chunk.__components) do
|
for f, _ in pairs(chunk.__components) do
|
||||||
@@ -213,7 +223,9 @@ local function __chunk_with_fragment(chunk, fragment)
|
|||||||
setmetatable(child_chunk, evolved_chunk_mt)
|
setmetatable(child_chunk, evolved_chunk_mt)
|
||||||
|
|
||||||
do
|
do
|
||||||
chunk.__children[fragment] = child_chunk
|
table.insert(chunk.__children, child_chunk)
|
||||||
|
chunk.__with_fragment_cache[fragment] = child_chunk
|
||||||
|
child_chunk.__without_fragment_cache[fragment] = chunk
|
||||||
end
|
end
|
||||||
|
|
||||||
__on_new_chunk(child_chunk)
|
__on_new_chunk(child_chunk)
|
||||||
@@ -229,13 +241,22 @@ local function __chunk_without_fragment(chunk, fragment)
|
|||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
do
|
||||||
|
local cached_chunk = chunk.__without_fragment_cache[fragment]
|
||||||
|
if cached_chunk then return cached_chunk end
|
||||||
|
end
|
||||||
|
|
||||||
if fragment.__guid == chunk.__fragment.__guid then
|
if fragment.__guid == chunk.__fragment.__guid then
|
||||||
return chunk.__parent
|
return chunk.__parent
|
||||||
end
|
end
|
||||||
|
|
||||||
if fragment.__guid < chunk.__fragment.__guid then
|
if fragment.__guid < chunk.__fragment.__guid then
|
||||||
local sibling_chunk = __chunk_without_fragment(chunk.__parent, fragment)
|
local sibling_chunk = __chunk_with_fragment(
|
||||||
return __chunk_with_fragment(sibling_chunk, chunk.__fragment)
|
__chunk_without_fragment(chunk.__parent, fragment),
|
||||||
|
chunk.__fragment)
|
||||||
|
chunk.__without_fragment_cache[fragment] = sibling_chunk
|
||||||
|
sibling_chunk.__with_fragment_cache[fragment] = chunk
|
||||||
|
return sibling_chunk
|
||||||
end
|
end
|
||||||
|
|
||||||
return chunk
|
return chunk
|
||||||
@@ -463,7 +484,7 @@ function registry.execute(query)
|
|||||||
local matched_chunk = matched_chunk_stack[#matched_chunk_stack]
|
local matched_chunk = matched_chunk_stack[#matched_chunk_stack]
|
||||||
matched_chunk_stack[#matched_chunk_stack] = nil
|
matched_chunk_stack[#matched_chunk_stack] = nil
|
||||||
|
|
||||||
for _, matched_chunk_child in pairs(matched_chunk.__children) do
|
for _, matched_chunk_child in ipairs(matched_chunk.__children) do
|
||||||
matched_chunk_stack[#matched_chunk_stack + 1] = matched_chunk_child
|
matched_chunk_stack[#matched_chunk_stack + 1] = matched_chunk_child
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user