a lot of micro-optimizations

This commit is contained in:
BlackMATov
2025-01-25 08:34:59 +07:00
parent 3fb7dbae25
commit 30c9d25378
2 changed files with 228 additions and 114 deletions

View File

@@ -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

View File

@@ -43,6 +43,8 @@ local evolved = {
---@field package __fragment evolved.fragment
---@field package __fragment_set table<evolved.fragment, boolean>
---@field package __fragment_list evolved.fragment[]
---@field package __fragment_count integer
---@field package __component_count integer
---@field package __component_indices table<evolved.fragment, integer>
---@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