diff --git a/ROADMAP.md b/ROADMAP.md index 1626d33..e825d00 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -9,3 +9,5 @@ - add REQUIRES fragment trait - try to keep entity_chunks/places tables as arrays - set/assign/insert/remove/destroy for lists? +- when we call hooks from chunk operations, we should use precached hook functions +- we shouldn't clear big reusable tables diff --git a/evolved.lua b/evolved.lua index d8497e7..c645c8d 100644 --- a/evolved.lua +++ b/evolved.lua @@ -43,6 +43,8 @@ local evolved = { ---@field package __fragment evolved.fragment ---@field package __fragment_set table ---@field package __fragment_list evolved.fragment[] +---@field package __fragment_count integer +---@field package __component_count integer ---@field package __component_indices table ---@field package __component_storages evolved.component_storage[] ---@field package __component_fragments evolved.fragment[] @@ -300,10 +302,11 @@ local function __each_iterator(each_state) end local entity_chunk_fragment_list = entity_chunk.__fragment_list + local entity_chunk_fragment_count = entity_chunk.__fragment_count local entity_chunk_component_indices = entity_chunk.__component_indices local entity_chunk_component_storages = entity_chunk.__component_storages - if fragment_index <= #entity_chunk_fragment_list then + if fragment_index <= entity_chunk_fragment_count then each_state[4] = fragment_index + 1 local fragment = entity_chunk_fragment_list[fragment_index] local component_index = entity_chunk_component_indices[fragment] @@ -508,6 +511,8 @@ local function __root_chunk(root_fragment) __fragment = root_fragment, __fragment_set = root_fragment_set, __fragment_list = root_fragment_list, + __fragment_count = 0, + __component_count = 0, __component_indices = root_component_indices, __component_storages = root_component_storages, __component_fragments = root_component_fragments, @@ -532,6 +537,11 @@ local function __root_chunk(root_fragment) end end + do + root_chunk.__fragment_count = #root_chunk.__fragment_list + root_chunk.__component_count = #root_chunk.__component_fragments + end + do __root_chunks[root_fragment] = root_chunk end @@ -603,6 +613,8 @@ local function __chunk_with_fragment(parent_chunk, child_fragment) __fragment = child_fragment, __fragment_set = child_fragment_set, __fragment_list = child_fragment_list, + __fragment_count = 0, + __component_count = 0, __component_indices = child_component_indices, __component_storages = child_component_storages, __component_fragments = child_component_fragments, @@ -650,6 +662,11 @@ local function __chunk_with_fragment(parent_chunk, child_fragment) child_chunk.__without_fragment_edges[child_fragment] = parent_chunk end + do + child_chunk.__fragment_count = #child_chunk.__fragment_list + child_chunk.__component_count = #child_chunk.__component_fragments + end + do local fragment_chunks = __major_chunks[child_fragment] @@ -1047,6 +1064,7 @@ local function __chunk_insert(chunk, fragment, ...) local old_entities = old_chunk.__entities local old_size = #old_entities + local old_component_count = old_chunk.__component_count local old_component_storages = old_chunk.__component_storages local old_component_fragments = old_chunk.__component_fragments @@ -1061,7 +1079,7 @@ local function __chunk_insert(chunk, fragment, ...) old_entities, 1, old_size, new_size + 1, new_entities) - for i = 1, #old_component_fragments do + for i = 1, old_component_count do local old_f = old_component_fragments[i] local old_cs = old_component_storages[i] local new_ci = new_component_indices[old_f] @@ -1127,17 +1145,20 @@ local function __chunk_insert(chunk, fragment, ...) end end + local entity_chunks = __entity_chunks + local entity_places = __entity_places + for new_place = new_size + 1, new_size + old_size do local entity = new_entities[new_place] local entity_index = entity % 0x100000 - __entity_chunks[entity_index] = new_chunk - __entity_places[entity_index] = new_place + entity_chunks[entity_index] = new_chunk + entity_places[entity_index] = new_place end do old_chunk.__entities = {} - for i = 1, #old_component_storages do + for i = 1, old_component_count do old_component_storages[i] = {} end end @@ -1172,6 +1193,7 @@ local function __chunk_remove(chunk, ...) local old_size = #old_entities local old_fragment_set = old_chunk.__fragment_set + local old_component_count = old_chunk.__component_count local old_component_indices = chunk.__component_indices local old_component_storages = chunk.__component_storages @@ -1206,10 +1228,14 @@ local function __chunk_remove(chunk, ...) __release_table(__TABLE_POOL_TAG__FRAGMENT_SET, removed_set) end + local entity_chunks = __entity_chunks + local entity_places = __entity_places + if new_chunk then local new_entities = new_chunk.__entities local new_size = #new_entities + local new_component_count = new_chunk.__component_count local new_component_storages = new_chunk.__component_storages local new_component_fragments = new_chunk.__component_fragments @@ -1217,7 +1243,7 @@ local function __chunk_remove(chunk, ...) old_entities, 1, old_size, new_size + 1, new_entities) - for i = 1, #new_component_fragments do + for i = 1, new_component_count do local new_f = new_component_fragments[i] local new_cs = new_component_storages[i] local old_ci = old_component_indices[new_f] @@ -1230,22 +1256,22 @@ local function __chunk_remove(chunk, ...) for new_place = new_size + 1, new_size + old_size do local entity = new_entities[new_place] local entity_index = entity % 0x100000 - __entity_chunks[entity_index] = new_chunk - __entity_places[entity_index] = new_place + entity_chunks[entity_index] = new_chunk + entity_places[entity_index] = new_place end else for old_place = 1, old_size do local entity = old_entities[old_place] local entity_index = entity % 0x100000 - __entity_chunks[entity_index] = nil - __entity_places[entity_index] = nil + entity_chunks[entity_index] = nil + entity_places[entity_index] = nil end end do old_chunk.__entities = {} - for i = 1, #old_component_storages do + for i = 1, old_component_count do old_component_storages[i] = {} end end @@ -1265,11 +1291,15 @@ local function __chunk_clear(chunk) local chunk_entities = chunk.__entities local chunk_size = #chunk_entities + local chunk_component_count = chunk.__component_count local chunk_component_indices = chunk.__component_indices local chunk_component_storages = chunk.__component_storages if chunk.__has_remove_hooks then - for _, fragment in ipairs(chunk.__fragment_list) do + local chunk_fragment_list = chunk.__fragment_list + local chunk_fragment_count = chunk.__fragment_count + for i = 1, chunk_fragment_count do + local fragment = chunk_fragment_list[i] if __fragment_has_remove_hook(fragment) then local component_index = chunk_component_indices[fragment] if component_index then @@ -1289,17 +1319,20 @@ local function __chunk_clear(chunk) end end + local entity_chunks = __entity_chunks + local entity_places = __entity_places + for place = 1, chunk_size do local entity = chunk_entities[place] local entity_index = entity % 0x100000 - __entity_chunks[entity_index] = nil - __entity_places[entity_index] = nil + entity_chunks[entity_index] = nil + entity_places[entity_index] = nil end do chunk.__entities = {} - for i = 1, #chunk_component_storages do + for i = 1, chunk_component_count do chunk_component_storages[i] = {} end end @@ -1319,11 +1352,15 @@ local function __chunk_destroy(chunk) local chunk_entities = chunk.__entities local chunk_size = #chunk_entities + local chunk_component_count = chunk.__component_count local chunk_component_indices = chunk.__component_indices local chunk_component_storages = chunk.__component_storages if chunk.__has_remove_hooks then - for _, fragment in ipairs(chunk.__fragment_list) do + local chunk_fragment_list = chunk.__fragment_list + local chunk_fragment_count = chunk.__fragment_count + for i = 1, chunk_fragment_count do + local fragment = chunk_fragment_list[i] if __fragment_has_remove_hook(fragment) then local component_index = chunk_component_indices[fragment] if component_index then @@ -1343,18 +1380,21 @@ local function __chunk_destroy(chunk) end end + local entity_chunks = __entity_chunks + local entity_places = __entity_places + for place = 1, chunk_size do local entity = chunk_entities[place] local entity_index = entity % 0x100000 - __entity_chunks[entity_index] = nil - __entity_places[entity_index] = nil + entity_chunks[entity_index] = nil + entity_places[entity_index] = nil __release_id(entity) end do chunk.__entities = {} - for i = 1, #chunk_component_storages do + for i = 1, chunk_component_count do chunk_component_storages[i] = {} end end @@ -1389,6 +1429,7 @@ local function __chunk_multi_set(chunk, fragments, components) local old_size = #old_entities local old_fragment_set = old_chunk.__fragment_set + local old_component_count = old_chunk.__component_count local old_component_indices = old_chunk.__component_indices local old_component_storages = old_chunk.__component_storages local old_component_fragments = old_chunk.__component_fragments @@ -1483,7 +1524,7 @@ local function __chunk_multi_set(chunk, fragments, components) old_entities, 1, old_size, new_size + 1, new_entities) - for i = 1, #old_component_fragments do + for i = 1, old_component_count do local old_f = old_component_fragments[i] local old_cs = old_component_storages[i] local new_ci = new_component_indices[old_f] @@ -1652,17 +1693,20 @@ local function __chunk_multi_set(chunk, fragments, components) __release_table(__TABLE_POOL_TAG__FRAGMENT_SET, inserted_set) + local entity_chunks = __entity_chunks + local entity_places = __entity_places + for new_place = new_size + 1, new_size + old_size do local entity = new_entities[new_place] local entity_index = entity % 0x100000 - __entity_chunks[entity_index] = new_chunk - __entity_places[entity_index] = new_place + entity_chunks[entity_index] = new_chunk + entity_places[entity_index] = new_place end do old_chunk.__entities = {} - for i = 1, #old_component_storages do + for i = 1, old_component_count do old_component_storages[i] = {} end end @@ -1808,6 +1852,7 @@ local function __chunk_multi_insert(chunk, fragments, components) local old_size = #old_entities local old_fragment_set = old_chunk.__fragment_set + local old_component_count = old_chunk.__component_count local old_component_storages = old_chunk.__component_storages local old_component_fragments = old_chunk.__component_fragments @@ -1822,7 +1867,7 @@ local function __chunk_multi_insert(chunk, fragments, components) old_entities, 1, old_size, new_size + 1, new_entities) - for i = 1, #old_component_fragments do + for i = 1, old_component_count do local old_f = old_component_fragments[i] local old_cs = old_component_storages[i] local new_ci = new_component_indices[old_f] @@ -1916,17 +1961,20 @@ local function __chunk_multi_insert(chunk, fragments, components) __release_table(__TABLE_POOL_TAG__FRAGMENT_SET, inserted_set) + local entity_chunks = __entity_chunks + local entity_places = __entity_places + for new_place = new_size + 1, new_size + old_size do local entity = new_entities[new_place] local entity_index = entity % 0x100000 - __entity_chunks[entity_index] = new_chunk - __entity_places[entity_index] = new_place + entity_chunks[entity_index] = new_chunk + entity_places[entity_index] = new_place end do old_chunk.__entities = {} - for i = 1, #old_component_storages do + for i = 1, old_component_count do old_component_storages[i] = {} end end @@ -1960,6 +2008,7 @@ local function __chunk_multi_remove(chunk, fragments) local old_size = #old_entities local old_fragment_set = old_chunk.__fragment_set + local old_component_count = old_chunk.__component_count local old_component_indices = old_chunk.__component_indices local old_component_storages = old_chunk.__component_storages @@ -1994,10 +2043,14 @@ local function __chunk_multi_remove(chunk, fragments) __release_table(__TABLE_POOL_TAG__FRAGMENT_SET, removed_set) end + local entity_chunks = __entity_chunks + local entity_places = __entity_places + if new_chunk then local new_entities = new_chunk.__entities local new_size = #new_entities + local new_component_count = new_chunk.__component_count local new_component_storages = new_chunk.__component_storages local new_component_fragments = new_chunk.__component_fragments @@ -2005,7 +2058,7 @@ local function __chunk_multi_remove(chunk, fragments) old_entities, 1, old_size, new_size + 1, new_entities) - for i = 1, #new_component_fragments do + for i = 1, new_component_count do local new_f = new_component_fragments[i] local new_cs = new_component_storages[i] local old_ci = old_component_indices[new_f] @@ -2018,22 +2071,22 @@ local function __chunk_multi_remove(chunk, fragments) for new_place = new_size + 1, new_size + old_size do local entity = new_entities[new_place] local entity_index = entity % 0x100000 - __entity_chunks[entity_index] = new_chunk - __entity_places[entity_index] = new_place + entity_chunks[entity_index] = new_chunk + entity_places[entity_index] = new_place end else for old_place = 1, old_size do local entity = old_entities[old_place] local entity_index = entity % 0x100000 - __entity_chunks[entity_index] = nil - __entity_places[entity_index] = nil + entity_chunks[entity_index] = nil + entity_places[entity_index] = nil end end do old_chunk.__entities = {} - for i = 1, #old_component_storages do + for i = 1, old_component_count do old_component_storages[i] = {} end end @@ -2054,12 +2107,13 @@ local function __detach_entity(chunk, place) local chunk_entities = chunk.__entities local chunk_size = #chunk_entities + local chunk_component_count = chunk.__component_count local chunk_component_storages = chunk.__component_storages if place == chunk_size then chunk_entities[place] = nil - for i = 1, #chunk_component_storages do + for i = 1, chunk_component_count do local component_storage = chunk_component_storages[i] component_storage[place] = nil end @@ -2071,7 +2125,7 @@ local function __detach_entity(chunk, place) chunk_entities[place] = last_entity chunk_entities[chunk_size] = nil - for i = 1, #chunk_component_storages do + for i = 1, chunk_component_count do local component_storage = chunk_component_storages[i] local last_component = component_storage[chunk_size] component_storage[place] = last_component @@ -2090,44 +2144,47 @@ local function __spawn_entity_at(entity, chunk, fragments, components) end local chunk_entities = chunk.__entities - local chunk_fragment_list = chunk.__fragment_list + local chunk_component_count = chunk.__component_count local chunk_component_indices = chunk.__component_indices local chunk_component_storages = chunk.__component_storages + local chunk_component_fragments = chunk.__component_fragments + local chunk_has_defaults_or_constructs = chunk.__has_defaults_or_constructs + local chunk_has_set_or_insert_hooks = chunk.__has_set_or_insert_hooks local place = #chunk_entities + 1 chunk_entities[place] = entity - for i = 1, #chunk_fragment_list do - local fragment = chunk_fragment_list[i] - local component_index = chunk_component_indices[fragment] + if chunk_has_defaults_or_constructs then + for i = 1, chunk_component_count do + local fragment = chunk_component_fragments[i] + local component_storage = chunk_component_storages[i] - if component_index then - local component_storage = chunk_component_storages[component_index] + local new_component = evolved.get(fragment, evolved.DEFAULT) - if chunk.__has_defaults_or_constructs then - local new_component = evolved.get(fragment, evolved.DEFAULT) - - if new_component == nil then - new_component = true - end - - component_storage[place] = new_component - else - local new_component = true - - component_storage[place] = new_component + if new_component == nil then + new_component = true end + + component_storage[place] = new_component + end + else + for i = 1, chunk_component_count do + local component_storage = chunk_component_storages[i] + + local new_component = true + + component_storage[place] = new_component end end - for i = 1, #fragments do - local fragment = fragments[i] - local component_index = chunk_component_indices[fragment] + if chunk_has_defaults_or_constructs then + for i = 1, #fragments do + local fragment = fragments[i] + local component_index = chunk_component_indices[fragment] - if component_index then - local component_storage = chunk_component_storages[component_index] + if component_index then + local component_storage = chunk_component_storages[component_index] - if chunk.__has_defaults_or_constructs then local new_component = components[i] if new_component == nil then @@ -2139,7 +2196,16 @@ local function __spawn_entity_at(entity, chunk, fragments, components) end component_storage[place] = new_component - else + end + end + else + for i = 1, #fragments do + local fragment = fragments[i] + local component_index = chunk_component_indices[fragment] + + if component_index then + local component_storage = chunk_component_storages[component_index] + local new_component = components[i] if new_component == nil then @@ -2151,8 +2217,10 @@ local function __spawn_entity_at(entity, chunk, fragments, components) end end - if chunk.__has_set_or_insert_hooks then - for i = 1, #chunk_fragment_list do + if chunk_has_set_or_insert_hooks then + local chunk_fragment_list = chunk.__fragment_list + local chunk_fragment_count = chunk.__fragment_count + for i = 1, chunk_fragment_count do local fragment = chunk_fragment_list[i] local component_index = chunk_component_indices[fragment] @@ -2169,6 +2237,7 @@ local function __spawn_entity_at(entity, chunk, fragments, components) end local entity_index = entity % 0x100000 + __entity_chunks[entity_index] = chunk __entity_places[entity_index] = place @@ -2185,21 +2254,22 @@ local function __spawn_entity_with(entity, chunk, fragments, components) end local chunk_entities = chunk.__entities - local chunk_fragment_list = chunk.__fragment_list local chunk_component_indices = chunk.__component_indices local chunk_component_storages = chunk.__component_storages + local chunk_has_defaults_or_constructs = chunk.__has_defaults_or_constructs + local chunk_has_set_or_insert_hooks = chunk.__has_set_or_insert_hooks local place = #chunk_entities + 1 chunk_entities[place] = entity - for i = 1, #fragments do - local fragment = fragments[i] - local component_index = chunk_component_indices[fragment] + if chunk_has_defaults_or_constructs then + for i = 1, #fragments do + local fragment = fragments[i] + local component_index = chunk_component_indices[fragment] - if component_index then - local component_storage = chunk_component_storages[component_index] + if component_index then + local component_storage = chunk_component_storages[component_index] - if chunk.__has_defaults_or_constructs then local new_component = components[i] if new_component == nil then @@ -2211,7 +2281,16 @@ local function __spawn_entity_with(entity, chunk, fragments, components) end component_storage[place] = new_component - else + end + end + else + for i = 1, #fragments do + local fragment = fragments[i] + local component_index = chunk_component_indices[fragment] + + if component_index then + local component_storage = chunk_component_storages[component_index] + local new_component = components[i] if new_component == nil then @@ -2223,8 +2302,10 @@ local function __spawn_entity_with(entity, chunk, fragments, components) end end - if chunk.__has_set_or_insert_hooks then - for i = 1, #chunk_fragment_list do + if chunk_has_set_or_insert_hooks then + local chunk_fragment_list = chunk.__fragment_list + local chunk_fragment_count = chunk.__fragment_count + for i = 1, chunk_fragment_count do local fragment = chunk_fragment_list[i] local component_index = chunk_component_indices[fragment] @@ -2241,6 +2322,7 @@ local function __spawn_entity_with(entity, chunk, fragments, components) end local entity_index = entity % 0x100000 + __entity_chunks[entity_index] = chunk __entity_places[entity_index] = place @@ -3451,8 +3533,11 @@ function evolved.set(entity, fragment, ...) return false, false end - local old_chunk = __entity_chunks[entity_index] - local old_place = __entity_places[entity_index] + local entity_chunks = __entity_chunks + local entity_places = __entity_places + + local old_chunk = entity_chunks[entity_index] + local old_place = entity_places[entity_index] local new_chunk = __chunk_with_fragment(old_chunk, fragment) @@ -3506,10 +3591,11 @@ function evolved.set(entity, fragment, ...) new_entities[new_place] = entity if old_chunk then + local old_component_count = old_chunk.__component_count local old_component_storages = old_chunk.__component_storages local old_component_fragments = old_chunk.__component_fragments - for i = 1, #old_component_fragments do + for i = 1, old_component_count do local old_f = old_component_fragments[i] local old_cs = old_component_storages[i] local new_ci = new_component_indices[old_f] @@ -3556,8 +3642,8 @@ function evolved.set(entity, fragment, ...) end end - __entity_chunks[entity_index] = new_chunk - __entity_places[entity_index] = new_place + entity_chunks[entity_index] = new_chunk + entity_places[entity_index] = new_place __structural_changes = __structural_changes + 1 end @@ -3654,8 +3740,11 @@ function evolved.insert(entity, fragment, ...) return false, false end - local old_chunk = __entity_chunks[entity_index] - local old_place = __entity_places[entity_index] + local entity_chunks = __entity_chunks + local entity_places = __entity_places + + local old_chunk = entity_chunks[entity_index] + local old_place = entity_places[entity_index] local new_chunk = __chunk_with_fragment(old_chunk, fragment) @@ -3674,10 +3763,11 @@ function evolved.insert(entity, fragment, ...) new_entities[new_place] = entity if old_chunk then + local old_component_count = old_chunk.__component_count local old_component_storages = old_chunk.__component_storages local old_component_fragments = old_chunk.__component_fragments - for i = 1, #old_component_fragments do + for i = 1, old_component_count do local old_f = old_component_fragments[i] local old_cs = old_component_storages[i] local new_ci = new_component_indices[old_f] @@ -3724,8 +3814,8 @@ function evolved.insert(entity, fragment, ...) end end - __entity_chunks[entity_index] = new_chunk - __entity_places[entity_index] = new_place + entity_chunks[entity_index] = new_chunk + entity_places[entity_index] = new_place __structural_changes = __structural_changes + 1 end @@ -3750,8 +3840,11 @@ function evolved.remove(entity, ...) return false, false end - local old_chunk = __entity_chunks[entity_index] - local old_place = __entity_places[entity_index] + local entity_chunks = __entity_chunks + local entity_places = __entity_places + + local old_chunk = entity_chunks[entity_index] + local old_place = entity_places[entity_index] local new_chunk = __chunk_without_fragments(old_chunk, ...) @@ -3784,13 +3877,14 @@ function evolved.remove(entity, ...) if new_chunk then local new_entities = new_chunk.__entities + local new_component_count = new_chunk.__component_count local new_component_storages = new_chunk.__component_storages local new_component_fragments = new_chunk.__component_fragments local new_place = #new_entities + 1 new_entities[new_place] = entity - for i = 1, #new_component_fragments do + for i = 1, new_component_count do local new_f = new_component_fragments[i] local new_cs = new_component_storages[i] local old_ci = old_component_indices[new_f] @@ -3802,13 +3896,13 @@ function evolved.remove(entity, ...) __detach_entity(old_chunk, old_place) - __entity_chunks[entity_index] = new_chunk - __entity_places[entity_index] = new_place + entity_chunks[entity_index] = new_chunk + entity_places[entity_index] = new_place else __detach_entity(old_chunk, old_place) - __entity_chunks[entity_index] = nil - __entity_places[entity_index] = nil + entity_chunks[entity_index] = nil + entity_places[entity_index] = nil end __structural_changes = __structural_changes + 1 @@ -3833,8 +3927,11 @@ function evolved.clear(entity) return false, false end - local chunk = __entity_chunks[entity_index] - local place = __entity_places[entity_index] + local entity_chunks = __entity_chunks + local entity_places = __entity_places + + local chunk = entity_chunks[entity_index] + local place = entity_places[entity_index] if not chunk then return true, false @@ -3863,8 +3960,8 @@ function evolved.clear(entity) __detach_entity(chunk, place) - __entity_chunks[entity_index] = nil - __entity_places[entity_index] = nil + entity_chunks[entity_index] = nil + entity_places[entity_index] = nil __structural_changes = __structural_changes + 1 end @@ -3888,8 +3985,11 @@ function evolved.destroy(entity) return true, false end - local chunk = __entity_chunks[entity_index] - local place = __entity_places[entity_index] + local entity_chunks = __entity_chunks + local entity_places = __entity_places + + local chunk = entity_chunks[entity_index] + local place = entity_places[entity_index] if not chunk then __release_id(entity) @@ -3920,8 +4020,8 @@ function evolved.destroy(entity) __detach_entity(chunk, place) __release_id(entity) - __entity_chunks[entity_index] = nil - __entity_places[entity_index] = nil + entity_chunks[entity_index] = nil + entity_places[entity_index] = nil __structural_changes = __structural_changes + 1 end @@ -3957,8 +4057,11 @@ function evolved.multi_set(entity, fragments, components) return false, false end - local old_chunk = __entity_chunks[entity_index] - local old_place = __entity_places[entity_index] + local entity_chunks = __entity_chunks + local entity_places = __entity_places + + local old_chunk = entity_chunks[entity_index] + local old_place = entity_places[entity_index] local new_chunk = __chunk_with_fragment_list(old_chunk, fragments) @@ -4032,10 +4135,11 @@ function evolved.multi_set(entity, fragments, components) new_entities[new_place] = entity if old_chunk then + local old_component_count = old_chunk.__component_count local old_component_storages = old_chunk.__component_storages local old_component_fragments = old_chunk.__component_fragments - for i = 1, #old_component_fragments do + for i = 1, old_component_count do local old_f = old_component_fragments[i] local old_cs = old_component_storages[i] local new_ci = new_component_indices[old_f] @@ -4143,8 +4247,8 @@ function evolved.multi_set(entity, fragments, components) __release_table(__TABLE_POOL_TAG__FRAGMENT_SET, inserted_set) - __entity_chunks[entity_index] = new_chunk - __entity_places[entity_index] = new_place + entity_chunks[entity_index] = new_chunk + entity_places[entity_index] = new_place __structural_changes = __structural_changes + 1 end @@ -4275,8 +4379,11 @@ function evolved.multi_insert(entity, fragments, components) return false, false end - local old_chunk = __entity_chunks[entity_index] - local old_place = __entity_places[entity_index] + local entity_chunks = __entity_chunks + local entity_places = __entity_places + + local old_chunk = entity_chunks[entity_index] + local old_place = entity_places[entity_index] local new_chunk = __chunk_with_fragment_list(old_chunk, fragments) @@ -4297,10 +4404,11 @@ function evolved.multi_insert(entity, fragments, components) new_entities[new_place] = entity if old_chunk then + local old_component_count = old_chunk.__component_count local old_component_storages = old_chunk.__component_storages local old_component_fragments = old_chunk.__component_fragments - for i = 1, #old_component_fragments do + for i = 1, old_component_count do local old_f = old_component_fragments[i] local old_cs = old_component_storages[i] local new_ci = new_component_indices[old_f] @@ -4364,8 +4472,8 @@ function evolved.multi_insert(entity, fragments, components) __release_table(__TABLE_POOL_TAG__FRAGMENT_SET, inserted_set) - __entity_chunks[entity_index] = new_chunk - __entity_places[entity_index] = new_place + entity_chunks[entity_index] = new_chunk + entity_places[entity_index] = new_place __structural_changes = __structural_changes + 1 end @@ -4396,8 +4504,11 @@ function evolved.multi_remove(entity, fragments) return false, false end - local old_chunk = __entity_chunks[entity_index] - local old_place = __entity_places[entity_index] + local entity_chunks = __entity_chunks + local entity_places = __entity_places + + local old_chunk = entity_chunks[entity_index] + local old_place = entity_places[entity_index] local new_chunk = __chunk_without_fragment_list(old_chunk, fragments) @@ -4435,13 +4546,14 @@ function evolved.multi_remove(entity, fragments) if new_chunk then local new_entities = new_chunk.__entities + local new_component_count = new_chunk.__component_count local new_component_storages = new_chunk.__component_storages local new_component_fragments = new_chunk.__component_fragments local new_place = #new_entities + 1 new_entities[new_place] = entity - for i = 1, #new_component_fragments do + for i = 1, new_component_count do local new_f = new_component_fragments[i] local new_cs = new_component_storages[i] local old_ci = old_component_indices[new_f] @@ -4453,13 +4565,13 @@ function evolved.multi_remove(entity, fragments) __detach_entity(old_chunk, old_place) - __entity_chunks[entity_index] = new_chunk - __entity_places[entity_index] = new_place + entity_chunks[entity_index] = new_chunk + entity_places[entity_index] = new_place else __detach_entity(old_chunk, old_place) - __entity_chunks[entity_index] = nil - __entity_places[entity_index] = nil + entity_chunks[entity_index] = nil + entity_places[entity_index] = nil end __structural_changes = __structural_changes + 1