Skip to content

Add system with lower priority during iteration  #310

@fabiitch

Description

@fabiitch

Hey
If you add a system during iteration (so inside an other system)
if the system add has a priority lower than current system in update, the order is fuck.

example : system with priority 1, 4 5, 10
at start u add 1,5,10
during first update of system 5 u add system 4
the system called in this update is 1, 5, 5, 10

System manager should implement a delayed operation like entity manager

example code at AddRemoveSystemDuringIterationTest.java

/**
 * 3 systems add at engine start with priority 1, 5, 10
 * System 5 add system with priority 4 during first iteration by system 5
 *
 */
public class AddRemoveSystemDuringIterationTest {
    Engine engine;
    List<Integer> systemCallOrder; //updateIndex -> list by priority
    boolean firstUpdateDone = false;

    private void addSystemUpdateCall(EntitySystem entitySystem) {
        systemCallOrder.add(entitySystem.priority);
    }

    @Before
    public void setUp() {
        engine = new Engine();
        systemCallOrder = new ArrayList<>();
        firstUpdateDone = false;
    }

    @Test
    public void addSystemDuringIterationTest() {
        engine = new Engine();
        EntitySystem system1 = new NamedSystem(1) {
        };
        EntitySystem system10 = new NamedSystem(10) {
        };
        final EntitySystem system4 = new NamedSystem(4) {  //System added during update
        };
        EntitySystem system5 = new NamedSystem(5) {

            @Override
            public void update(float deltaTime) {
                super.update(deltaTime);
                if (!firstUpdateDone) {
                    getEngine().addSystem(system4);
                    firstUpdateDone = true;
                }
            }
        };

        engine.addSystem(system1);
        engine.addSystem(system10);
        engine.addSystem(system5);

        engine.update(1); //it add system 45 add system 4 during iteration

        List<Integer> expected = Arrays.asList(1, 5, 10); //system 4 should not be called
        Assert.assertArrayEquals(expected.toArray(), systemCallOrder.toArray()); // result 1, 5, 5, 10

        systemCallOrder.clear();
        engine.update(1);
        expected = Arrays.asList(1, 4, 5, 10); //second update ok
        Assert.assertArrayEquals(expected.toArray(), systemCallOrder.toArray());

    }

    private class NamedSystem extends EntitySystem {

        public NamedSystem(int priority) {
            super(priority);
        }

        @Override
        public void update(float deltaTime) {
            addSystemUpdateCall(this);
        }
    }
}

thanks for reading

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions