Skip to content

Commit 7e15e57

Browse files
committed
improve entity builder performance
1 parent 8c90df6 commit 7e15e57

3 files changed

Lines changed: 52 additions & 27 deletions

File tree

ROADMAP.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## Backlog
44

55
- builders should be rewritten :/
6+
- add PREFAB entity trait
67
- is/has_all/any for lists?
78

89
## After first release

develop/untests.lua

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3158,6 +3158,20 @@ do
31583158
end
31593159
end
31603160

3161+
do
3162+
local f1, f2 = evo.id(2)
3163+
local eb = evo.entity()
3164+
3165+
local e1 = eb:set(f1, 1):set(f2, 2):build()
3166+
local e2 = eb:set(f1, 11):build()
3167+
3168+
assert(evo.has(e1, f1) and evo.get(e1, f1) == 1)
3169+
assert(evo.has(e1, f2) and evo.get(e1, f2) == 2)
3170+
3171+
assert(evo.has(e2, f1) and evo.get(e2, f1) == 11)
3172+
assert(not evo.has(e2, f2) and evo.get(e2, f2) == nil)
3173+
end
3174+
31613175
do
31623176
local f1, f2, f3 = evo.id(3)
31633177

evolved.lua

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4139,6 +4139,10 @@ end
41394139
---@param components evolved.component[]
41404140
---@param component_count integer
41414141
function __defer_spawn_entity_at(entity, chunk, fragments, fragment_count, components, component_count)
4142+
if component_count > fragment_count then
4143+
component_count = fragment_count
4144+
end
4145+
41424146
---@type evolved.fragment[]
41434147
local fragment_list = __acquire_table(__table_pool_tag.fragment_list)
41444148
__lua_table_move(fragments, 1, fragment_count, 1, fragment_list)
@@ -4190,6 +4194,10 @@ end
41904194
---@param components evolved.component[]
41914195
---@param component_count integer
41924196
function __defer_spawn_entity_as(entity, prefab, fragments, fragment_count, components, component_count)
4197+
if component_count > fragment_count then
4198+
component_count = fragment_count
4199+
end
4200+
41934201
---@type evolved.fragment[]
41944202
local fragment_list = __acquire_table(__table_pool_tag.fragment_list)
41954203
__lua_table_move(fragments, 1, fragment_count, 1, fragment_list)
@@ -4241,6 +4249,10 @@ end
42414249
---@param components evolved.component[]
42424250
---@param component_count integer
42434251
function __defer_spawn_entity_with(entity, chunk, fragments, fragment_count, components, component_count)
4252+
if component_count > fragment_count then
4253+
component_count = fragment_count
4254+
end
4255+
42444256
---@type evolved.fragment[]
42454257
local fragment_list = __acquire_table(__table_pool_tag.fragment_list)
42464258
__lua_table_move(fragments, 1, fragment_count, 1, fragment_list)
@@ -6154,9 +6166,9 @@ end
61546166
local __builder_fns = {}
61556167

61566168
---@class evolved.entity_builder
6157-
---@field package __fragment_list? evolved.fragment[]
6158-
---@field package __component_list? evolved.component[]
6159-
---@field package __component_count? integer
6169+
---@field package __fragment_list evolved.fragment[]
6170+
---@field package __component_list evolved.component[]
6171+
---@field package __component_count integer
61606172
__builder_fns.entity_builder = {}
61616173
__builder_fns.entity_builder.__index = __builder_fns.entity_builder
61626174

@@ -6203,7 +6215,11 @@ __builder_fns.system_builder.__index = __builder_fns.system_builder
62036215
---@return evolved.entity_builder builder
62046216
---@nodiscard
62056217
function __evolved_entity()
6206-
return __lua_setmetatable({}, __builder_fns.entity_builder)
6218+
return __lua_setmetatable({
6219+
__fragment_list = {},
6220+
__component_list = {},
6221+
__component_count = 0,
6222+
}, __builder_fns.entity_builder)
62076223
end
62086224

62096225
---@param fragment evolved.fragment
@@ -6212,19 +6228,8 @@ end
62126228
function __builder_fns.entity_builder:set(fragment, component)
62136229
local fragment_list = self.__fragment_list
62146230
local component_list = self.__component_list
6215-
local component_count = self.__component_count or 0
6216-
6217-
if component_count == 0 then
6218-
fragment_list = __acquire_table(__table_pool_tag.fragment_list)
6219-
component_list = __acquire_table(__table_pool_tag.component_list)
6220-
self.__fragment_list = fragment_list
6221-
self.__component_list = component_list
6222-
end
6223-
6224-
---@cast fragment_list -?
6225-
---@cast component_list -?
62266231

6227-
component_count = component_count + 1
6232+
local component_count = self.__component_count + 1
62286233
self.__component_count = component_count
62296234

62306235
fragment_list[component_count] = fragment
@@ -6237,23 +6242,28 @@ end
62376242
function __builder_fns.entity_builder:build()
62386243
local fragment_list = self.__fragment_list
62396244
local component_list = self.__component_list
6240-
local component_count = self.__component_count or 0
62416245

6242-
self.__fragment_list = nil
6243-
self.__component_list = nil
6244-
self.__component_count = nil
6246+
local component_count = self.__component_count
6247+
self.__component_count = 0
62456248

6246-
if component_count == 0 then
6247-
return __evolved_id()
6249+
if __debug_mode then
6250+
__debug_fns.validate_fragment_list(fragment_list, component_count)
62486251
end
62496252

6250-
---@cast fragment_list -?
6251-
---@cast component_list -?
6253+
local entity = __acquire_id()
6254+
local entity_chunk = __chunk_fragment_list(fragment_list, component_count)
62526255

6253-
local entity = __evolved_spawn_with(fragment_list, component_list)
6256+
if __defer_depth > 0 then
6257+
__defer_spawn_entity_with(entity, entity_chunk,
6258+
fragment_list, component_count,
6259+
component_list, component_count)
6260+
end
62546261

6255-
__release_table(__table_pool_tag.fragment_list, fragment_list)
6256-
__release_table(__table_pool_tag.component_list, component_list)
6262+
__evolved_defer()
6263+
do
6264+
__spawn_entity_with(entity, entity_chunk, fragment_list, component_count, component_list)
6265+
end
6266+
__evolved_commit()
62576267

62586268
return entity
62596269
end

0 commit comments

Comments
 (0)