package com.badlogic.ashley.benchmark.ashley;
import org.junit.BeforeClass;
import org.junit.Test;
import com.badlogic.ashley.benchmark.Constants;
import com.badlogic.ashley.benchmark.Constants.ComponentType;
import com.badlogic.ashley.benchmark.ashley.components.MovementComponent;
import com.badlogic.ashley.benchmark.ashley.components.PositionComponent;
import com.badlogic.ashley.benchmark.ashley.components.RadiusComponent;
import com.badlogic.ashley.benchmark.ashley.components.StateComponent;
import com.badlogic.ashley.benchmark.ashley.systems.CollisionSystem;
import com.badlogic.ashley.benchmark.ashley.systems.MovementSystem;
import com.badlogic.ashley.benchmark.ashley.systems.RemovalSystem;
import com.badlogic.ashley.benchmark.ashley.systems.StateSystem;
import com.badlogic.ashley.core.Engine;
import com.badlogic.ashley.core.Entity;
import com.badlogic.gdx.math.MathUtils;
import com.carrotsearch.junitbenchmarks.AbstractBenchmark;
import com.carrotsearch.junitbenchmarks.BenchmarkOptions;
public class AshleyBenchmark extends AbstractBenchmark {
private static Engine engineSmall;
private static Engine engineMedium;
private static Engine engineBig;
@BeforeClass
public static void prepare()
{
engineSmall = prepareEngine(Constants.ENTITIES_SMALL_TEST);
engineMedium = prepareEngine(Constants.ENTITIES_MEDIUM_TEST);
engineBig = prepareEngine(Constants.ENTITIES_BIG_TEST);
}
@BenchmarkOptions(benchmarkRounds = Constants.BENCHMARK_ROUNDS, warmupRounds = Constants.WARMUP_ROUNDS)
@Test
public void ashleySmallTest() {
runEngineTest(engineSmall);
}
@BenchmarkOptions(benchmarkRounds = Constants.BENCHMARK_ROUNDS, warmupRounds = Constants.WARMUP_ROUNDS)
@Test
public void ashleyMediumTest() {
runEngineTest(engineMedium);
}
@BenchmarkOptions(benchmarkRounds = Constants.BENCHMARK_ROUNDS, warmupRounds = Constants.WARMUP_ROUNDS)
@Test
public void ashleyBigTest() {
runEngineTest(engineBig);
}
private void runEngineTest(Engine engine) {
for (int i = 0; i < Constants.FRAMES; ++i) {
engine.update(Constants.DELTA_TIME);
}
}
private static Engine prepareEngine(int numEntities) {
Engine engine = new Engine();
engine.addSystem(new MovementSystem());
engine.addSystem(new StateSystem());
engine.addSystem(new CollisionSystem());
engine.addSystem(new RemovalSystem());
for (int i = 0; i < numEntities; ++i) {
Entity entity = new Entity();
if (Constants.shouldHaveComponent(ComponentType.POSITION, i)) {
PositionComponent pos = new PositionComponent();
pos.pos.x = MathUtils.random(Constants.MIN_POS, Constants.MAX_POS);
pos.pos.y = MathUtils.random(Constants.MIN_POS, Constants.MAX_POS);
entity.add(pos);
}
if (Constants.shouldHaveComponent(ComponentType.MOVEMENT, i)) {
MovementComponent mov = new MovementComponent();
mov.velocity.x = MathUtils.random(Constants.MIN_VEL, Constants.MAX_VEL);
mov.velocity.y = MathUtils.random(Constants.MIN_VEL, Constants.MAX_VEL);
mov.accel.x = MathUtils.random(Constants.MIN_ACC, Constants.MAX_ACC);
mov.accel.y = MathUtils.random(Constants.MIN_ACC, Constants.MAX_ACC);
entity.add(mov);
}
if (Constants.shouldHaveComponent(ComponentType.RADIUS, i)) {
RadiusComponent rad = new RadiusComponent();
rad.radius = MathUtils.random(Constants.MIN_RADIUS, Constants.MAX_RADIUS);
entity.add(rad);
}
if (Constants.shouldHaveComponent(ComponentType.STATE, i)) {
entity.add(new StateComponent());
}
engine.addEntity(entity);
}
return engine;
}
}