diff --git a/source/bubel/ecs/manager.d b/source/bubel/ecs/manager.d index 132ab62..fa64e7b 100644 --- a/source/bubel/ecs/manager.d +++ b/source/bubel/ecs/manager.d @@ -1496,7 +1496,7 @@ export struct EntityManager { int reamaining_entities = (entities_per_job - entities_count - ( first_block.entities_count - first_elem)); - + //if first block don't fill job if (reamaining_entities > 0) { @@ -1510,7 +1510,8 @@ export struct EntityManager if (full_blocks_count * info.max_entities + entities_count + ( first_block.entities_count - first_elem) >= entities_per_job) { - assert(entities_per_job == full_blocks_count * info.max_entities + entities_count + (first_block.entities_count - first_elem)); + assert(entities_per_job == full_blocks_count * info.max_entities + entities_count + ( + first_block.entities_count - first_elem)); CallData data = CallData(caller.system_id, sys, info, sys.m_update_delegate, first_block, cast(ushort)(full_blocks_count + 1), @@ -1535,7 +1536,7 @@ export struct EntityManager first_elem = last_elem; blocks_count -= full_blocks_count + 1; first_block = block; - if(last_elem == block.entities_count) + if (last_elem == block.entities_count) { assert(block.next_block == null); first_block = null; @@ -1553,7 +1554,7 @@ export struct EntityManager first_elem += last_elem; assert(first_elem <= first_block.entities_count); //if job takes every entity, take next block - if(first_elem == first_block.entities_count) + if (first_elem == first_block.entities_count) { first_elem = 0; first_block = first_block.next_block; diff --git a/tests/basic.d b/tests/basic.d index 5046dff..5830a7b 100644 --- a/tests/basic.d +++ b/tests/basic.d @@ -897,7 +897,7 @@ unittest { struct TestSystem { - mixin ECS.System; + mixin ECS.System!64; struct EntitiesData { @@ -1003,15 +1003,51 @@ unittest assert(empty_system.update == 3); system.entities = 0; - foreach(i;0..10000)gEM.addEntity(tmpl); + // foreach(i;0..10000)gEM.addEntity(tmpl); - gEM.begin(); + // gEM.begin(); - gEM.updateMT("custom"); + // gEM.updateMT("custom"); - gEM.end(); + // gEM.end(); - assert(system.entities == 12001); + // assert(system.entities == 12001); + + void clearEntities(TestSystem.EntitiesData data) + { + foreach(i;0..data.length) + { + gEM.removeEntity(data.entity[i].id); + } + } + gEM.callEntitiesFunction!TestSystem(&clearEntities); + gEM.commit(); + + foreach(i;0..2000) + { + gEM.addEntity(tmpl); + + gEM.begin(); + gEM.updateMT("custom"); + gEM.end(); + + assert(system.entities == i+1); + system.entities = 0; + } + + foreach(i;0..90000)gEM.addEntity(tmpl); + + foreach(i;0..2000) + { + gEM.addEntity(tmpl); + + gEM.begin(); + gEM.updateMT("custom"); + gEM.end(); + + assert(system.entities == i+92001); + system.entities = 0; + } } unittest