Change to manual init for entity tag map

The entity tag mapping is not that used often enough.

So, change it to manual init.
scene_man
En Yi 2023-11-11 11:14:22 +08:00
parent 029415e19f
commit b150b3ad38
4 changed files with 31 additions and 9 deletions

View File

@ -252,6 +252,7 @@ struct EntityManager {
// All fields are Read-Only // All fields are Read-Only
struct sc_map_64v entities; // ent id : entity struct sc_map_64v entities; // ent id : entity
struct sc_map_64v entities_map[N_TAGS]; // [{ent id: ent}] struct sc_map_64v entities_map[N_TAGS]; // [{ent id: ent}]
bool tag_map_inited[N_TAGS];
struct sc_map_64v component_map[N_COMPONENTS]; // [{ent id: comp}, ...] struct sc_map_64v component_map[N_COMPONENTS]; // [{ent id: comp}, ...]
struct sc_queue_uint to_add; struct sc_queue_uint to_add;
struct sc_queue_uint to_remove; struct sc_queue_uint to_remove;
@ -259,6 +260,7 @@ struct EntityManager {
}; };
void init_entity_manager(EntityManager_t* p_manager); void init_entity_manager(EntityManager_t* p_manager);
void init_entity_tag_map(EntityManager_t* p_manager, unsigned int tag_number, unsigned int initial_size);
void update_entity_manager(EntityManager_t* p_manager); void update_entity_manager(EntityManager_t* p_manager);
void clear_entity_manager(EntityManager_t* p_manager); void clear_entity_manager(EntityManager_t* p_manager);
void free_entity_manager(EntityManager_t* p_manager); void free_entity_manager(EntityManager_t* p_manager);

View File

@ -7,15 +7,20 @@ void init_entity_manager(EntityManager_t* p_manager)
{ {
sc_map_init_64v(p_manager->component_map + i, MAX_COMP_POOL_SIZE, 0); sc_map_init_64v(p_manager->component_map + i, MAX_COMP_POOL_SIZE, 0);
} }
for (size_t i = 0; i < N_TAGS; ++i) memset(p_manager->tag_map_inited, 0, sizeof(p_manager->tag_map_inited));
{
sc_map_init_64v(p_manager->entities_map + i, MAX_COMP_POOL_SIZE, 0);
}
sc_queue_init(&p_manager->to_add); sc_queue_init(&p_manager->to_add);
sc_queue_init(&p_manager->to_remove); sc_queue_init(&p_manager->to_remove);
sc_queue_init(&p_manager->to_update); sc_queue_init(&p_manager->to_update);
} }
void init_entity_tag_map(EntityManager_t* p_manager, unsigned int tag_number, unsigned int initial_size)
{
if (tag_number >= N_TAGS) return;
sc_map_init_64v(p_manager->entities_map + tag_number, initial_size, 0);
p_manager->tag_map_inited[tag_number] = true;
}
void update_entity_manager(EntityManager_t* p_manager) void update_entity_manager(EntityManager_t* p_manager)
{ {
// This will only update the entity map of the manager // This will only update the entity map of the manager
@ -27,7 +32,10 @@ void update_entity_manager(EntityManager_t* p_manager)
{ {
Entity_t *p_entity = get_entity_wtih_id(e_idx); Entity_t *p_entity = get_entity_wtih_id(e_idx);
sc_map_put_64v(&p_manager->entities, e_idx, (void *)p_entity); sc_map_put_64v(&p_manager->entities, e_idx, (void *)p_entity);
sc_map_put_64v(&p_manager->entities_map[p_entity->m_tag], e_idx, (void *)p_entity); if (p_manager->tag_map_inited[p_entity->m_tag])
{
sc_map_put_64v(&p_manager->entities_map[p_entity->m_tag], e_idx, (void *)p_entity);
}
} }
sc_queue_clear(&p_manager->to_add); sc_queue_clear(&p_manager->to_add);
@ -42,7 +50,10 @@ void update_entity_manager(EntityManager_t* p_manager)
sc_map_del_64v(&p_manager->component_map[i], e_idx); sc_map_del_64v(&p_manager->component_map[i], e_idx);
p_entity->components[i] = MAX_COMP_POOL_SIZE; p_entity->components[i] = MAX_COMP_POOL_SIZE;
} }
sc_map_del_64v(&p_manager->entities_map[p_entity->m_tag], e_idx); if (p_manager->tag_map_inited[p_entity->m_tag])
{
sc_map_del_64v(&p_manager->entities_map[p_entity->m_tag], e_idx);
}
free_entity_to_mempool(e_idx); free_entity_to_mempool(e_idx);
sc_map_del_64v(&p_manager->entities, e_idx); sc_map_del_64v(&p_manager->entities, e_idx);
} }
@ -88,7 +99,10 @@ void free_entity_manager(EntityManager_t* p_manager)
} }
for (size_t i = 0; i < N_TAGS; ++i) for (size_t i = 0; i < N_TAGS; ++i)
{ {
sc_map_term_64v(p_manager->entities_map + i); if (p_manager->tag_map_inited[i])
{
sc_map_term_64v(p_manager->entities_map + i);
}
} }
sc_queue_term(&p_manager->to_add); sc_queue_term(&p_manager->to_add);
sc_queue_term(&p_manager->to_remove); sc_queue_term(&p_manager->to_remove);

View File

@ -883,8 +883,11 @@ static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed)
void init_sandbox_scene(LevelScene_t* scene) void init_sandbox_scene(LevelScene_t* scene)
{ {
//init_scene(&scene->scene, LEVEL_SCENE, &level_scene_render_func, &level_do_action);
init_scene(&scene->scene, &level_scene_render_func, &level_do_action); init_scene(&scene->scene, &level_scene_render_func, &level_do_action);
init_entity_tag_map(&scene->scene.ent_manager, PLAYER_ENT_TAG, 4);
init_entity_tag_map(&scene->scene.ent_manager, BOULDER_ENT_TAG, MAX_COMP_POOL_SIZE);
init_entity_tag_map(&scene->scene.ent_manager, LEVEL_END_TAG, 16);
init_entity_tag_map(&scene->scene.ent_manager, DYNMEM_ENT_TAG, 16);
scene->data.tilemap.tiles = all_tiles; scene->data.tilemap.tiles = all_tiles;
init_level_scene_data( init_level_scene_data(

View File

@ -345,8 +345,11 @@ static void render_regular_game_scene(Scene_t* scene)
void init_game_scene(LevelScene_t* scene) void init_game_scene(LevelScene_t* scene)
{ {
//init_scene(&scene->scene, LEVEL_SCENE, &level_scene_render_func, &level_do_action);
init_scene(&scene->scene, &level_scene_render_func, &level_do_action); init_scene(&scene->scene, &level_scene_render_func, &level_do_action);
init_entity_tag_map(&scene->scene.ent_manager, PLAYER_ENT_TAG, 4);
init_entity_tag_map(&scene->scene.ent_manager, BOULDER_ENT_TAG, MAX_COMP_POOL_SIZE);
init_entity_tag_map(&scene->scene.ent_manager, LEVEL_END_TAG, 16);
init_entity_tag_map(&scene->scene.ent_manager, DYNMEM_ENT_TAG, 16);
scene->data.tilemap.tiles = all_tiles; scene->data.tilemap.tiles = all_tiles;
init_level_scene_data( init_level_scene_data(