From 2da57f3c5e73758e4fa81511ba52edbb8710fe39 Mon Sep 17 00:00:00 2001 From: Sander Mertens Date: Sun, 1 Dec 2024 20:52:19 -0800 Subject: [PATCH] #1458 Reduce memory footprint * Reduce page size of non-entity sparse sets * Use map instead of sparse set for type_info * Remove unnecessary observer sparse set * Reduce size of low id record array --- distr/flecs.c | 77 +++++++++++++------------------ distr/flecs.h | 5 +- include/flecs.h | 4 +- include/flecs/private/api_types.h | 1 + src/addons/stats/stats.c | 2 +- src/observer.c | 10 ++-- src/private_types.h | 7 +-- src/storage/id_index.c | 20 ++++---- src/world.c | 38 ++++++--------- test/core/project.json | 1 - test/core/src/World.c | 53 --------------------- test/core/src/main.c | 7 +-- 12 files changed, 69 insertions(+), 156 deletions(-) diff --git a/distr/flecs.c b/distr/flecs.c index b7386f611b..c5df55a8f8 100644 --- a/distr/flecs.c +++ b/distr/flecs.c @@ -921,9 +921,6 @@ typedef struct ecs_store_t { /* Root table */ ecs_table_t root; - /* Observers */ - ecs_sparse_t observers; /* sparse */ - /* Records cache */ ecs_vec_t records; @@ -950,9 +947,9 @@ struct ecs_world_t { ecs_header_t hdr; /* -- Type metadata -- */ - ecs_id_record_t *id_index_lo; + ecs_id_record_t **id_index_lo; ecs_map_t id_index_hi; /* map */ - ecs_sparse_t type_info; /* sparse */ + ecs_map_t type_info; /* map */ /* -- Cached handle to id records -- */ ecs_id_record_t *idr_wildcard; @@ -15149,12 +15146,13 @@ ecs_observer_t* flecs_observer_init( ECS_INVALID_OPERATION, "cannot create observer: must at least specify callback or run"); - ecs_observer_impl_t *impl = flecs_sparse_add_t( - &world->store.observers, ecs_observer_impl_t); + ecs_observer_impl_t *impl = flecs_calloc_t( + &world->allocator, ecs_observer_impl_t); ecs_assert(impl != NULL, ECS_INTERNAL_ERROR, NULL); + impl->id = ++ world->observable.last_observer_id; + flecs_poly_init(impl, ecs_observer_t); ecs_observer_t *o = &impl->pub; - impl->id = flecs_sparse_last_id(&world->store.observers); impl->dtor = flecs_observer_poly_fini; /* Make writeable copy of query desc so that we can set name. This will @@ -15433,8 +15431,7 @@ void flecs_observer_fini( } flecs_poly_fini(o, ecs_observer_t); - flecs_sparse_remove_t( - &world->store.observers, ecs_observer_impl_t, impl->id); + flecs_free_t(&world->allocator, ecs_observer_impl_t, o); } void flecs_observer_set_disable_bit( @@ -18349,10 +18346,6 @@ void flecs_init_store( /* Initialize root table */ flecs_init_root_table(world); - - /* Initialize observer sparse set */ - flecs_sparse_init_t(&world->store.observers, - a, &world->allocators.sparse_chunk, ecs_observer_impl_t); } static @@ -18490,10 +18483,6 @@ void flecs_fini_store(ecs_world_t *world) { flecs_entities_clear(world); flecs_hashmap_fini(&world->store.table_map); - ecs_assert(flecs_sparse_count(&world->store.observers) == 0, - ECS_INTERNAL_ERROR, NULL); - flecs_sparse_fini(&world->store.observers); - ecs_assert(ecs_vec_count(&world->store.marked_ids) == 0, ECS_INTERNAL_ERROR, NULL); ecs_assert(ecs_vec_count(&world->store.deleted_components) == 0, @@ -18724,11 +18713,10 @@ ecs_world_t *ecs_mini(void) { flecs_world_allocators_init(world); ecs_allocator_t *a = &world->allocator; - world->self = world; - flecs_sparse_init_t(&world->type_info, a, - &world->allocators.sparse_chunk, ecs_type_info_t); + ecs_map_init(&world->type_info, a); ecs_map_init_w_params(&world->id_index_hi, &world->allocators.ptr); - world->id_index_lo = ecs_os_calloc_n(ecs_id_record_t, FLECS_HI_ID_RECORD_ID); + world->id_index_lo = ecs_os_calloc_n( + ecs_id_record_t*, FLECS_HI_ID_RECORD_ID); flecs_observable_init(&world->observable); world->pending_tables = ecs_os_calloc_t(ecs_sparse_t); @@ -19313,14 +19301,13 @@ static void flecs_fini_type_info( ecs_world_t *world) { - int32_t i, count = flecs_sparse_count(&world->type_info); - ecs_sparse_t *type_info = &world->type_info; - for (i = 0; i < count; i ++) { - ecs_type_info_t *ti = flecs_sparse_get_dense_t(type_info, - ecs_type_info_t, i); + ecs_map_iter_t it = ecs_map_iter(&world->type_info); + while (ecs_map_next(&it)) { + ecs_type_info_t *ti = ecs_map_ptr(&it); flecs_type_info_fini(ti); + ecs_os_free(ti); } - flecs_sparse_fini(&world->type_info); + ecs_map_fini(&world->type_info); } ecs_entity_t flecs_get_oneof( @@ -19594,7 +19581,7 @@ const ecs_type_info_t* flecs_type_info_get( ecs_assert(component != 0, ECS_INTERNAL_ERROR, NULL); ecs_assert(!(component & ECS_ID_FLAGS_MASK), ECS_INTERNAL_ERROR, NULL); - return flecs_sparse_try_t(&world->type_info, ecs_type_info_t, component); + return ecs_map_get_deref(&world->type_info, ecs_type_info_t, component); } ecs_type_info_t* flecs_type_info_ensure( @@ -19607,7 +19594,7 @@ ecs_type_info_t* flecs_type_info_ensure( const ecs_type_info_t *ti = flecs_type_info_get(world, component); ecs_type_info_t *ti_mut = NULL; if (!ti) { - ti_mut = flecs_sparse_ensure_t( + ti_mut = ecs_map_ensure_alloc_t( &world->type_info, ecs_type_info_t, component); ecs_assert(ti_mut != NULL, ECS_INTERNAL_ERROR, NULL); ti_mut->component = component; @@ -19646,7 +19633,7 @@ bool flecs_type_info_init_id( ecs_assert(size == 0 && alignment == 0, ECS_INVALID_COMPONENT_SIZE, NULL); ecs_assert(li == NULL, ECS_INCONSISTENT_COMPONENT_ACTION, NULL); - flecs_sparse_remove_t(&world->type_info, ecs_type_info_t, component); + ecs_map_remove_free(&world->type_info, component); } else { ti = flecs_type_info_ensure(world, component); ecs_assert(ti != NULL, ECS_INTERNAL_ERROR, NULL); @@ -19728,11 +19715,11 @@ void flecs_type_info_free( return; } - ecs_type_info_t *ti = flecs_sparse_try_t(&world->type_info, - ecs_type_info_t, component); + ecs_type_info_t *ti = ecs_map_get_deref( + &world->type_info, ecs_type_info_t, component); if (ti) { flecs_type_info_fini(ti); - flecs_sparse_remove_t(&world->type_info, ecs_type_info_t, component); + ecs_map_remove_free(&world->type_info, component); } } @@ -36062,12 +36049,12 @@ ecs_id_record_t* flecs_id_record_new( { ecs_id_record_t *idr, *idr_t = NULL; ecs_id_t hash = flecs_id_record_hash(id); + idr = flecs_bcalloc(&world->allocators.id_record); + if (hash >= FLECS_HI_ID_RECORD_ID) { - idr = flecs_bcalloc(&world->allocators.id_record); ecs_map_insert_ptr(&world->id_index_hi, hash, idr); } else { - idr = &world->id_index_lo[hash]; - ecs_os_zeromem(idr); + world->id_index_lo[hash] = idr; } ecs_table_cache_init(world, &idr->cache); @@ -36343,11 +36330,12 @@ void flecs_id_record_free( ecs_id_t hash = flecs_id_record_hash(id); if (hash >= FLECS_HI_ID_RECORD_ID) { ecs_map_remove(&world->id_index_hi, hash); - flecs_bfree(&world->allocators.id_record, idr); } else { - idr->id = 0; /* Tombstone */ + world->id_index_lo[hash] = NULL; } + flecs_bfree(&world->allocators.id_record, idr); + if (ecs_should_log_1()) { char *id_str = ecs_id_str(world, id); ecs_dbg_1("#[green]id#[normal] %s #[red]deleted", id_str); @@ -36384,10 +36372,7 @@ ecs_id_record_t* flecs_id_record_get( if (hash >= FLECS_HI_ID_RECORD_ID) { idr = ecs_map_get_deref(&world->id_index_hi, ecs_id_record_t, hash); } else { - idr = &world->id_index_lo[hash]; - if (!idr->id) { - idr = NULL; - } + idr = world->id_index_lo[hash]; } return idr; @@ -36542,8 +36527,8 @@ void flecs_fini_id_records( int32_t i; for (i = 0; i < FLECS_HI_ID_RECORD_ID; i ++) { - ecs_id_record_t *idr = &world->id_index_lo[i]; - if (idr->id) { + ecs_id_record_t *idr = world->id_index_lo[i]; + if (idr) { flecs_id_record_release(world, idr); } } @@ -63162,7 +63147,7 @@ void ecs_world_stats_get( ECS_GAUGE_RECORD(&s->components.tag_count, t, world->info.tag_id_count); ECS_GAUGE_RECORD(&s->components.component_count, t, world->info.component_id_count); ECS_GAUGE_RECORD(&s->components.pair_count, t, world->info.pair_id_count); - ECS_GAUGE_RECORD(&s->components.type_count, t, ecs_sparse_count(&world->type_info)); + ECS_GAUGE_RECORD(&s->components.type_count, t, ecs_map_count(&world->type_info)); ECS_COUNTER_RECORD(&s->components.create_count, t, world->info.id_create_total); ECS_COUNTER_RECORD(&s->components.delete_count, t, world->info.id_delete_total); diff --git a/distr/flecs.h b/distr/flecs.h index dc7e065211..f324b5eeb8 100644 --- a/distr/flecs.h +++ b/distr/flecs.h @@ -216,7 +216,7 @@ #ifdef FLECS_LOW_FOOTPRINT #define FLECS_HI_COMPONENT_ID (16) #define FLECS_HI_ID_RECORD_ID (16) -#define FLECS_SPARSE_PAGE_BITS (6) +#define FLECS_SPARSE_PAGE_BITS (4) #define FLECS_ENTITY_PAGE_BITS (6) #define FLECS_USE_OS_ALLOC #endif @@ -251,7 +251,7 @@ * determines the page size, which is (1 << bits). * Lower values decrease memory utilization, at the cost of more allocations. */ #ifndef FLECS_SPARSE_PAGE_BITS -#define FLECS_SPARSE_PAGE_BITS (12) +#define FLECS_SPARSE_PAGE_BITS (6) #endif /** @def FLECS_ENTITY_PAGE_BITS @@ -3674,6 +3674,7 @@ struct ecs_observable_t { ecs_event_record_t on_set; ecs_event_record_t on_wildcard; ecs_sparse_t events; /* sparse */ + uint64_t last_observer_id; }; /** Range in table */ diff --git a/include/flecs.h b/include/flecs.h index d1e7d81486..8dde6591f1 100644 --- a/include/flecs.h +++ b/include/flecs.h @@ -214,7 +214,7 @@ #ifdef FLECS_LOW_FOOTPRINT #define FLECS_HI_COMPONENT_ID (16) #define FLECS_HI_ID_RECORD_ID (16) -#define FLECS_SPARSE_PAGE_BITS (6) +#define FLECS_SPARSE_PAGE_BITS (4) #define FLECS_ENTITY_PAGE_BITS (6) #define FLECS_USE_OS_ALLOC #endif @@ -249,7 +249,7 @@ * determines the page size, which is (1 << bits). * Lower values decrease memory utilization, at the cost of more allocations. */ #ifndef FLECS_SPARSE_PAGE_BITS -#define FLECS_SPARSE_PAGE_BITS (12) +#define FLECS_SPARSE_PAGE_BITS (6) #endif /** @def FLECS_ENTITY_PAGE_BITS diff --git a/include/flecs/private/api_types.h b/include/flecs/private/api_types.h index 83afc3873f..70473620a0 100644 --- a/include/flecs/private/api_types.h +++ b/include/flecs/private/api_types.h @@ -45,6 +45,7 @@ struct ecs_observable_t { ecs_event_record_t on_set; ecs_event_record_t on_wildcard; ecs_sparse_t events; /* sparse */ + uint64_t last_observer_id; }; /** Range in table */ diff --git a/src/addons/stats/stats.c b/src/addons/stats/stats.c index 7da6f8270b..0f01c3e72d 100644 --- a/src/addons/stats/stats.c +++ b/src/addons/stats/stats.c @@ -278,7 +278,7 @@ void ecs_world_stats_get( ECS_GAUGE_RECORD(&s->components.tag_count, t, world->info.tag_id_count); ECS_GAUGE_RECORD(&s->components.component_count, t, world->info.component_id_count); ECS_GAUGE_RECORD(&s->components.pair_count, t, world->info.pair_id_count); - ECS_GAUGE_RECORD(&s->components.type_count, t, ecs_sparse_count(&world->type_info)); + ECS_GAUGE_RECORD(&s->components.type_count, t, ecs_map_count(&world->type_info)); ECS_COUNTER_RECORD(&s->components.create_count, t, world->info.id_create_total); ECS_COUNTER_RECORD(&s->components.delete_count, t, world->info.id_delete_total); diff --git a/src/observer.c b/src/observer.c index 5bff025d96..4eb7433e72 100644 --- a/src/observer.c +++ b/src/observer.c @@ -954,12 +954,13 @@ ecs_observer_t* flecs_observer_init( ECS_INVALID_OPERATION, "cannot create observer: must at least specify callback or run"); - ecs_observer_impl_t *impl = flecs_sparse_add_t( - &world->store.observers, ecs_observer_impl_t); + ecs_observer_impl_t *impl = flecs_calloc_t( + &world->allocator, ecs_observer_impl_t); ecs_assert(impl != NULL, ECS_INTERNAL_ERROR, NULL); + impl->id = ++ world->observable.last_observer_id; + flecs_poly_init(impl, ecs_observer_t); ecs_observer_t *o = &impl->pub; - impl->id = flecs_sparse_last_id(&world->store.observers); impl->dtor = flecs_observer_poly_fini; /* Make writeable copy of query desc so that we can set name. This will @@ -1238,8 +1239,7 @@ void flecs_observer_fini( } flecs_poly_fini(o, ecs_observer_t); - flecs_sparse_remove_t( - &world->store.observers, ecs_observer_impl_t, impl->id); + flecs_free_t(&world->allocator, ecs_observer_impl_t, o); } void flecs_observer_set_disable_bit( diff --git a/src/private_types.h b/src/private_types.h index dbb11a43c9..bd5b208b3a 100644 --- a/src/private_types.h +++ b/src/private_types.h @@ -270,9 +270,6 @@ typedef struct ecs_store_t { /* Root table */ ecs_table_t root; - /* Observers */ - ecs_sparse_t observers; /* sparse */ - /* Records cache */ ecs_vec_t records; @@ -299,9 +296,9 @@ struct ecs_world_t { ecs_header_t hdr; /* -- Type metadata -- */ - ecs_id_record_t *id_index_lo; + ecs_id_record_t **id_index_lo; ecs_map_t id_index_hi; /* map */ - ecs_sparse_t type_info; /* sparse */ + ecs_map_t type_info; /* map */ /* -- Cached handle to id records -- */ ecs_id_record_t *idr_wildcard; diff --git a/src/storage/id_index.c b/src/storage/id_index.c index d546f11f61..841aabfb23 100644 --- a/src/storage/id_index.c +++ b/src/storage/id_index.c @@ -193,12 +193,12 @@ ecs_id_record_t* flecs_id_record_new( { ecs_id_record_t *idr, *idr_t = NULL; ecs_id_t hash = flecs_id_record_hash(id); + idr = flecs_bcalloc(&world->allocators.id_record); + if (hash >= FLECS_HI_ID_RECORD_ID) { - idr = flecs_bcalloc(&world->allocators.id_record); ecs_map_insert_ptr(&world->id_index_hi, hash, idr); } else { - idr = &world->id_index_lo[hash]; - ecs_os_zeromem(idr); + world->id_index_lo[hash] = idr; } ecs_table_cache_init(world, &idr->cache); @@ -474,11 +474,12 @@ void flecs_id_record_free( ecs_id_t hash = flecs_id_record_hash(id); if (hash >= FLECS_HI_ID_RECORD_ID) { ecs_map_remove(&world->id_index_hi, hash); - flecs_bfree(&world->allocators.id_record, idr); } else { - idr->id = 0; /* Tombstone */ + world->id_index_lo[hash] = NULL; } + flecs_bfree(&world->allocators.id_record, idr); + if (ecs_should_log_1()) { char *id_str = ecs_id_str(world, id); ecs_dbg_1("#[green]id#[normal] %s #[red]deleted", id_str); @@ -515,10 +516,7 @@ ecs_id_record_t* flecs_id_record_get( if (hash >= FLECS_HI_ID_RECORD_ID) { idr = ecs_map_get_deref(&world->id_index_hi, ecs_id_record_t, hash); } else { - idr = &world->id_index_lo[hash]; - if (!idr->id) { - idr = NULL; - } + idr = world->id_index_lo[hash]; } return idr; @@ -673,8 +671,8 @@ void flecs_fini_id_records( int32_t i; for (i = 0; i < FLECS_HI_ID_RECORD_ID; i ++) { - ecs_id_record_t *idr = &world->id_index_lo[i]; - if (idr->id) { + ecs_id_record_t *idr = world->id_index_lo[i]; + if (idr) { flecs_id_record_release(world, idr); } } diff --git a/src/world.c b/src/world.c index bb7a375d33..cbe66941cc 100644 --- a/src/world.c +++ b/src/world.c @@ -585,10 +585,6 @@ void flecs_init_store( /* Initialize root table */ flecs_init_root_table(world); - - /* Initialize observer sparse set */ - flecs_sparse_init_t(&world->store.observers, - a, &world->allocators.sparse_chunk, ecs_observer_impl_t); } static @@ -726,10 +722,6 @@ void flecs_fini_store(ecs_world_t *world) { flecs_entities_clear(world); flecs_hashmap_fini(&world->store.table_map); - ecs_assert(flecs_sparse_count(&world->store.observers) == 0, - ECS_INTERNAL_ERROR, NULL); - flecs_sparse_fini(&world->store.observers); - ecs_assert(ecs_vec_count(&world->store.marked_ids) == 0, ECS_INTERNAL_ERROR, NULL); ecs_assert(ecs_vec_count(&world->store.deleted_components) == 0, @@ -960,11 +952,10 @@ ecs_world_t *ecs_mini(void) { flecs_world_allocators_init(world); ecs_allocator_t *a = &world->allocator; - world->self = world; - flecs_sparse_init_t(&world->type_info, a, - &world->allocators.sparse_chunk, ecs_type_info_t); + ecs_map_init(&world->type_info, a); ecs_map_init_w_params(&world->id_index_hi, &world->allocators.ptr); - world->id_index_lo = ecs_os_calloc_n(ecs_id_record_t, FLECS_HI_ID_RECORD_ID); + world->id_index_lo = ecs_os_calloc_n( + ecs_id_record_t*, FLECS_HI_ID_RECORD_ID); flecs_observable_init(&world->observable); world->pending_tables = ecs_os_calloc_t(ecs_sparse_t); @@ -1549,14 +1540,13 @@ static void flecs_fini_type_info( ecs_world_t *world) { - int32_t i, count = flecs_sparse_count(&world->type_info); - ecs_sparse_t *type_info = &world->type_info; - for (i = 0; i < count; i ++) { - ecs_type_info_t *ti = flecs_sparse_get_dense_t(type_info, - ecs_type_info_t, i); + ecs_map_iter_t it = ecs_map_iter(&world->type_info); + while (ecs_map_next(&it)) { + ecs_type_info_t *ti = ecs_map_ptr(&it); flecs_type_info_fini(ti); + ecs_os_free(ti); } - flecs_sparse_fini(&world->type_info); + ecs_map_fini(&world->type_info); } ecs_entity_t flecs_get_oneof( @@ -1830,7 +1820,7 @@ const ecs_type_info_t* flecs_type_info_get( ecs_assert(component != 0, ECS_INTERNAL_ERROR, NULL); ecs_assert(!(component & ECS_ID_FLAGS_MASK), ECS_INTERNAL_ERROR, NULL); - return flecs_sparse_try_t(&world->type_info, ecs_type_info_t, component); + return ecs_map_get_deref(&world->type_info, ecs_type_info_t, component); } ecs_type_info_t* flecs_type_info_ensure( @@ -1843,7 +1833,7 @@ ecs_type_info_t* flecs_type_info_ensure( const ecs_type_info_t *ti = flecs_type_info_get(world, component); ecs_type_info_t *ti_mut = NULL; if (!ti) { - ti_mut = flecs_sparse_ensure_t( + ti_mut = ecs_map_ensure_alloc_t( &world->type_info, ecs_type_info_t, component); ecs_assert(ti_mut != NULL, ECS_INTERNAL_ERROR, NULL); ti_mut->component = component; @@ -1882,7 +1872,7 @@ bool flecs_type_info_init_id( ecs_assert(size == 0 && alignment == 0, ECS_INVALID_COMPONENT_SIZE, NULL); ecs_assert(li == NULL, ECS_INCONSISTENT_COMPONENT_ACTION, NULL); - flecs_sparse_remove_t(&world->type_info, ecs_type_info_t, component); + ecs_map_remove_free(&world->type_info, component); } else { ti = flecs_type_info_ensure(world, component); ecs_assert(ti != NULL, ECS_INTERNAL_ERROR, NULL); @@ -1964,11 +1954,11 @@ void flecs_type_info_free( return; } - ecs_type_info_t *ti = flecs_sparse_try_t(&world->type_info, - ecs_type_info_t, component); + ecs_type_info_t *ti = ecs_map_get_deref( + &world->type_info, ecs_type_info_t, component); if (ti) { flecs_type_info_fini(ti); - flecs_sparse_remove_t(&world->type_info, ecs_type_info_t, component); + ecs_map_remove_free(&world->type_info, component); } } diff --git a/test/core/project.json b/test/core/project.json index 972e449194..da0fdfab5d 100644 --- a/test/core/project.json +++ b/test/core/project.json @@ -2007,7 +2007,6 @@ "entity_range_set_limit_to_lower_than_offset", "entity_range_overlapping_new_id", "entity_range_overlapping_new_bulk_id", - "dim", "phases", "phases_w_merging", "phases_match_in_create", diff --git a/test/core/src/World.c b/test/core/src/World.c index 357b0795dc..8e536a4b04 100644 --- a/test/core/src/World.c +++ b/test/core/src/World.c @@ -371,59 +371,6 @@ void World_get_tick(void) { ecs_fini(world); } -static int32_t malloc_count; - -static -void *test_malloc(ecs_size_t size) { - malloc_count ++; - return malloc(size); -} - -static -void *test_calloc(ecs_size_t size) { - malloc_count ++; - return calloc(size, 1); -} - -static -void *test_realloc(void *old_ptr, ecs_size_t size) { - malloc_count ++; - return realloc(old_ptr, size); -} - -void World_dim(void) { - ecs_os_set_api_defaults(); - ecs_os_api_t os_api = ecs_os_api; - os_api.malloc_ = test_malloc; - os_api.calloc_ = test_calloc; - os_api.realloc_ = test_realloc; - ecs_os_set_api(&os_api); - - ecs_world_t *world = ecs_mini(); - - ECS_COMPONENT(world, Position); - - /* Create single entity so that the table exists. This makes the allocation - * counts more predictable, as new_w_count won't trigger table creation */ - ecs_new_w(world, Position); - - ecs_dim(world, 1100); - - malloc_count = 0; - - ecs_bulk_new(world, Position, 500); - - test_int(malloc_count, 2); - - malloc_count = 0; - - ecs_bulk_new(world, Position, 500); - - test_int(malloc_count, 2); - - ecs_fini(world); -} - static void TOnLoad(ecs_iter_t *it) { Position *p = ecs_field(it, Position, 0); diff --git a/test/core/src/main.c b/test/core/src/main.c index b843d41a4a..3337a80bc0 100644 --- a/test/core/src/main.c +++ b/test/core/src/main.c @@ -1932,7 +1932,6 @@ void World_entity_range_set_limit_to_lower(void); void World_entity_range_set_limit_to_lower_than_offset(void); void World_entity_range_overlapping_new_id(void); void World_entity_range_overlapping_new_bulk_id(void); -void World_dim(void); void World_phases(void); void World_phases_w_merging(void); void World_phases_match_in_create(void); @@ -9806,10 +9805,6 @@ bake_test_case World_testcases[] = { "entity_range_overlapping_new_bulk_id", World_entity_range_overlapping_new_bulk_id }, - { - "dim", - World_dim - }, { "phases", World_phases @@ -11569,7 +11564,7 @@ static bake_test_suite suites[] = { "World", World_setup, NULL, - 67, + 66, World_testcases }, {