From b150b3ad3883b3cd51e491303e7b125b00d8f383 Mon Sep 17 00:00:00 2001 From: En Yi Date: Sat, 11 Nov 2023 11:14:22 +0800 Subject: [PATCH] Change to manual init for entity tag map The entity tag mapping is not that used often enough. So, change it to manual init. --- engine/EC.h | 2 ++ engine/entManager.c | 28 +++++++++++++++++++++------- scenes/editor_scene.c | 5 ++++- scenes/game_scene.c | 5 ++++- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/engine/EC.h b/engine/EC.h index 0cb94ea..c1b228c 100644 --- a/engine/EC.h +++ b/engine/EC.h @@ -252,6 +252,7 @@ struct EntityManager { // All fields are Read-Only struct sc_map_64v entities; // ent id : entity 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_queue_uint to_add; struct sc_queue_uint to_remove; @@ -259,6 +260,7 @@ struct EntityManager { }; 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 clear_entity_manager(EntityManager_t* p_manager); void free_entity_manager(EntityManager_t* p_manager); diff --git a/engine/entManager.c b/engine/entManager.c index 9bb382b..31a25e1 100644 --- a/engine/entManager.c +++ b/engine/entManager.c @@ -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); } - for (size_t i = 0; i < N_TAGS; ++i) - { - sc_map_init_64v(p_manager->entities_map + i, MAX_COMP_POOL_SIZE, 0); - } + memset(p_manager->tag_map_inited, 0, sizeof(p_manager->tag_map_inited)); sc_queue_init(&p_manager->to_add); sc_queue_init(&p_manager->to_remove); 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) { // 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); 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); @@ -42,7 +50,10 @@ void update_entity_manager(EntityManager_t* p_manager) sc_map_del_64v(&p_manager->component_map[i], e_idx); 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); 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) { - 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_remove); diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index fc6a353..219cc9b 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -883,8 +883,11 @@ static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed) 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_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; init_level_scene_data( diff --git a/scenes/game_scene.c b/scenes/game_scene.c index de14365..4ba3f78 100644 --- a/scenes/game_scene.c +++ b/scenes/game_scene.c @@ -345,8 +345,11 @@ static void render_regular_game_scene(Scene_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_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; init_level_scene_data(