From 7e15e57154f03184cee45ac59b628be5430c67a9 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Thu, 10 Apr 2025 14:53:22 +0700 Subject: [PATCH] improve entity builder performance --- ROADMAP.md | 1 + develop/untests.lua | 14 ++++++++++ evolved.lua | 64 ++++++++++++++++++++++++++------------------- 3 files changed, 52 insertions(+), 27 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index ad8a460..4bb3636 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -3,6 +3,7 @@ ## Backlog - builders should be rewritten :/ +- add PREFAB entity trait - is/has_all/any for lists? ## After first release diff --git a/develop/untests.lua b/develop/untests.lua index d01f1cc..59ebb68 100644 --- a/develop/untests.lua +++ b/develop/untests.lua @@ -3158,6 +3158,20 @@ do end end +do + local f1, f2 = evo.id(2) + local eb = evo.entity() + + local e1 = eb:set(f1, 1):set(f2, 2):build() + local e2 = eb:set(f1, 11):build() + + assert(evo.has(e1, f1) and evo.get(e1, f1) == 1) + assert(evo.has(e1, f2) and evo.get(e1, f2) == 2) + + assert(evo.has(e2, f1) and evo.get(e2, f1) == 11) + assert(not evo.has(e2, f2) and evo.get(e2, f2) == nil) +end + do local f1, f2, f3 = evo.id(3) diff --git a/evolved.lua b/evolved.lua index 8404eaf..baf96ec 100644 --- a/evolved.lua +++ b/evolved.lua @@ -4139,6 +4139,10 @@ end ---@param components evolved.component[] ---@param component_count integer function __defer_spawn_entity_at(entity, chunk, fragments, fragment_count, components, component_count) + if component_count > fragment_count then + component_count = fragment_count + end + ---@type evolved.fragment[] local fragment_list = __acquire_table(__table_pool_tag.fragment_list) __lua_table_move(fragments, 1, fragment_count, 1, fragment_list) @@ -4190,6 +4194,10 @@ end ---@param components evolved.component[] ---@param component_count integer function __defer_spawn_entity_as(entity, prefab, fragments, fragment_count, components, component_count) + if component_count > fragment_count then + component_count = fragment_count + end + ---@type evolved.fragment[] local fragment_list = __acquire_table(__table_pool_tag.fragment_list) __lua_table_move(fragments, 1, fragment_count, 1, fragment_list) @@ -4241,6 +4249,10 @@ end ---@param components evolved.component[] ---@param component_count integer function __defer_spawn_entity_with(entity, chunk, fragments, fragment_count, components, component_count) + if component_count > fragment_count then + component_count = fragment_count + end + ---@type evolved.fragment[] local fragment_list = __acquire_table(__table_pool_tag.fragment_list) __lua_table_move(fragments, 1, fragment_count, 1, fragment_list) @@ -6154,9 +6166,9 @@ end local __builder_fns = {} ---@class evolved.entity_builder ----@field package __fragment_list? evolved.fragment[] ----@field package __component_list? evolved.component[] ----@field package __component_count? integer +---@field package __fragment_list evolved.fragment[] +---@field package __component_list evolved.component[] +---@field package __component_count integer __builder_fns.entity_builder = {} __builder_fns.entity_builder.__index = __builder_fns.entity_builder @@ -6203,7 +6215,11 @@ __builder_fns.system_builder.__index = __builder_fns.system_builder ---@return evolved.entity_builder builder ---@nodiscard function __evolved_entity() - return __lua_setmetatable({}, __builder_fns.entity_builder) + return __lua_setmetatable({ + __fragment_list = {}, + __component_list = {}, + __component_count = 0, + }, __builder_fns.entity_builder) end ---@param fragment evolved.fragment @@ -6212,19 +6228,8 @@ end function __builder_fns.entity_builder:set(fragment, component) local fragment_list = self.__fragment_list local component_list = self.__component_list - local component_count = self.__component_count or 0 - if component_count == 0 then - fragment_list = __acquire_table(__table_pool_tag.fragment_list) - component_list = __acquire_table(__table_pool_tag.component_list) - self.__fragment_list = fragment_list - self.__component_list = component_list - end - - ---@cast fragment_list -? - ---@cast component_list -? - - component_count = component_count + 1 + local component_count = self.__component_count + 1 self.__component_count = component_count fragment_list[component_count] = fragment @@ -6237,23 +6242,28 @@ end function __builder_fns.entity_builder:build() local fragment_list = self.__fragment_list local component_list = self.__component_list - local component_count = self.__component_count or 0 - self.__fragment_list = nil - self.__component_list = nil - self.__component_count = nil + local component_count = self.__component_count + self.__component_count = 0 - if component_count == 0 then - return __evolved_id() + if __debug_mode then + __debug_fns.validate_fragment_list(fragment_list, component_count) end - ---@cast fragment_list -? - ---@cast component_list -? + local entity = __acquire_id() + local entity_chunk = __chunk_fragment_list(fragment_list, component_count) - local entity = __evolved_spawn_with(fragment_list, component_list) + if __defer_depth > 0 then + __defer_spawn_entity_with(entity, entity_chunk, + fragment_list, component_count, + component_list, component_count) + end - __release_table(__table_pool_tag.fragment_list, fragment_list) - __release_table(__table_pool_tag.component_list, component_list) + __evolved_defer() + do + __spawn_entity_with(entity, entity_chunk, fragment_list, component_count, component_list) + end + __evolved_commit() return entity end