From ef04f7aec7752268b9a86a5f46d991c7c69648e9 Mon Sep 17 00:00:00 2001 From: Adrian Papari Date: Sun, 8 Nov 2015 22:40:41 +0100 Subject: [PATCH] Fixes #390: limit ComponentMappers to one per component type per world. --- .../main/java/com/artemis/ComponentManager.java | 14 ++++++++++++-- artemis/src/main/java/com/artemis/World.java | 2 +- .../test/java/com/artemis/ComponentMapperTest.java | 10 ++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/artemis/src/main/java/com/artemis/ComponentManager.java b/artemis/src/main/java/com/artemis/ComponentManager.java index 47f91d787..7daa75285 100644 --- a/artemis/src/main/java/com/artemis/ComponentManager.java +++ b/artemis/src/main/java/com/artemis/ComponentManager.java @@ -35,6 +35,8 @@ public class ComponentManager extends BaseSystem { private final ComponentPool pooledComponents; private int highestSeenEntityId; + + private Bag componentMappers = new Bag(); protected final ComponentTypeFactory typeFactory; @@ -150,8 +152,7 @@ private void ensurePackedComponentCapacity(int entityId) { } } - protected BitSet getPackedComponentOwners(ComponentType type) - { + protected BitSet getPackedComponentOwners(ComponentType type) { BitSet owners = packedComponentOwners.safeGet(type.getIndex()); if (owners == null) { owners = new BitSet(); @@ -160,6 +161,15 @@ protected BitSet getPackedComponentOwners(ComponentType type) return owners; } + ComponentMapper getMapper(Class mapper) { + int index = typeFactory.getIndexFor(mapper); + if (componentMappers.safeGet(index) == null) { + componentMappers.set(index, ComponentMapper.getFor(mapper, world)); + } + + return componentMappers.get(index); + } + @SuppressWarnings("unchecked") T newInstance(Class componentClass, boolean constructorHasWorldParameter) { try { diff --git a/artemis/src/main/java/com/artemis/World.java b/artemis/src/main/java/com/artemis/World.java index c08b7b184..6866367f4 100644 --- a/artemis/src/main/java/com/artemis/World.java +++ b/artemis/src/main/java/com/artemis/World.java @@ -432,7 +432,7 @@ void updateEntityStates() { * @return mapper for specified component type */ public ComponentMapper getMapper(Class type) { - return BasicComponentMapper.getFor(type, this); + return cm.getMapper(type); } /** diff --git a/artemis/src/test/java/com/artemis/ComponentMapperTest.java b/artemis/src/test/java/com/artemis/ComponentMapperTest.java index 9b4135fdd..9184712b6 100644 --- a/artemis/src/test/java/com/artemis/ComponentMapperTest.java +++ b/artemis/src/test/java/com/artemis/ComponentMapperTest.java @@ -49,6 +49,16 @@ protected void process(Entity e) { createAndProcessWorld(new TestSystemA()); } + @Test + public void mappers_are_per_type_per_world() { + World w1 = new World(); + World w2 = new World(); + + assertNotSame(w1.getMapper(ComponentX.class), w2.getMapper(ComponentX.class)); + assertNotSame(w1.getMapper(ComponentX.class), w1.getMapper(ComponentY.class)); + assertSame(w1.getMapper(ComponentX.class), w1.getMapper(ComponentX.class)); + } + @Test public void create_if_exists_should_recycle_existing_component() {