public void AddingRemovingPerformance() { using var world = new GameWorld(); var component1 = world.RegisterComponent("Component1", new SingleComponentBoard(sizeof(int), 0)); for (var i = 0; i != 4; i++) { var entities = new GameEntityHandle[1000]; world.CreateEntityBulk(entities); var sw = new Stopwatch(); sw.Start(); foreach (var ent in entities) { world.AddComponent(ent, component1); } sw.Stop(); if (i != 0) { Console.WriteLine($"Add -> {sw.Elapsed.TotalMilliseconds}ms"); } sw.Restart(); foreach (var ent in entities) { world.RemoveComponent(ent, component1); } sw.Stop(); if (i != 0) { Console.WriteLine($"Remove -> {sw.Elapsed.TotalMilliseconds}ms"); } } }
public void TestBulk() { var lowest = TimeSpan.MaxValue; var entities = new GameEntityHandle[entityCount]; for (var iteration = 0; iteration != 100; iteration++) { var world = new GameWorld(); var sw = new Stopwatch(); var componentType = world.AsComponentType <Component>(); sw.Start(); world.CreateEntityBulk(entities); for (var i = 0; i != entityCount; i++) { var ent = entities[i]; world.AddComponent(ent, componentType); world.RemoveEntity(ent); } sw.Stop(); if (lowest > sw.Elapsed) { lowest = sw.Elapsed; } } Console.WriteLine($"{lowest.TotalMilliseconds}ms"); }
public void TestMillionEntitySystem() { const int size = 100_000; var gameWorld = new GameWorld(); var entities = new GameEntityHandle[size]; gameWorld.CreateEntityBulk(entities); var componentType = gameWorld.AsComponentType<IntComponent>(); for (var i = 0; i < size; i++) { gameWorld.AddComponent(entities[i], componentType); } var sw = new Stopwatch(); var lowest = TimeSpan.MaxValue; using var runner = new ThreadBatchRunner(1f); runner.StartPerformanceCriticalSection(); var query = new EntityQuery(gameWorld, new[] {componentType}); var system = new ArchetypeSystem<int>((in ReadOnlySpan<GameEntityHandle> entities, in SystemState<int> state) => { var accessor = new ComponentDataAccessor<IntComponent>(state.World); foreach (ref readonly var entity in entities) accessor[entity].Value++; }, query);
public void Test() { var world = new GameWorld(); var timeEntity = world.CreateEntity(); world.AddComponent(timeEntity, new Time { Delta = 0.25f }); var gravityEntity = world.CreateEntity(); var gravityComponent = world.AddComponent(gravityEntity, new Gravity { Value = { Y = -9.6f } }); var astronautOnEarth = world.CreateEntity(); world.AssignComponent(astronautOnEarth, gravityComponent); world.AddComponent(astronautOnEarth, new Velocity { Value = new Vector3(10, 0, 0) }); world.AddComponent <Position>(astronautOnEarth); var astronautOnMoon = world.CreateEntity(); world.AddComponent(astronautOnMoon, new Gravity { Value = { Y = -4 } }); world.AddComponent(astronautOnMoon, new Velocity { Value = new Vector3(10, 0, 0) }); world.AddComponent <Position>(astronautOnMoon);
public void Test1() { using var world = new GameWorld(); var component1 = world.RegisterComponent("Component1", new SingleComponentBoard(sizeof(int), 0)); var component2 = world.RegisterComponent("Component2", new SingleComponentBoard(sizeof(int), 0)); GameEntityHandle ent1, ent2, ent3; ent1 = world.CreateEntity(); world.AddComponent(ent1, component1); ent2 = world.CreateEntity(); world.AddComponent(ent2, component1); world.AddComponent(ent2, component2); ent3 = world.CreateEntity(); world.AddComponent(ent3, component1); Assert.AreEqual(world.GetArchetype(ent1), world.GetArchetype(ent3)); Assert.AreNotEqual(world.GetArchetype(ent1), world.GetArchetype(ent2)); }