implemented pooling, crazy good performance

This commit is contained in:
Daniel
2024-10-20 01:38:54 +03:00
parent 12bd92d8d3
commit 967db15be3
6 changed files with 65 additions and 22 deletions

View File

@@ -6,7 +6,7 @@ import org.lumijiez.bugger.entities.Entity;
public abstract class Projectile extends Entity { public abstract class Projectile extends Entity {
private float timeAlive = 0f; protected float timeAlive = 0f;
public Projectile(World world, String texturePath, float size) { public Projectile(World world, String texturePath, float size) {
super(world, texturePath, size); super(world, texturePath, size);
@@ -61,4 +61,9 @@ public abstract class Projectile extends Entity {
public void render() { public void render() {
super.render(); super.render();
} }
@Override
public void destroy() {
markedToDestroy = true;
}
} }

View File

@@ -5,19 +5,36 @@ import com.badlogic.gdx.physics.box2d.*;
import org.lumijiez.bugger.Bugger; import org.lumijiez.bugger.Bugger;
public class Ray extends Projectile { public class Ray extends Projectile {
float speed = 5000f;
public Ray(World world) {
super(world,"images/blaze.png", 5f);
this.body.setUserData(this);
}
public Ray(World world, Vector2 position, Vector2 direction) { public Ray(World world, Vector2 position, Vector2 direction) {
super(world, position, direction, "images/blaze.png", 5f); super(world, position, direction, "images/blaze.png", 5f);
this.body.setUserData(this); this.body.setUserData(this);
} }
public Ray(World world, Vector2 position, Vector2 direction, float speed) { public Ray(World world, Vector2 position, Vector2 direction, float speed) {
super(world, position, direction, "images/blaze.png", 5f, speed); super(world, position, direction, "images/blaze.png", 5f, speed);
this.speed = speed;
this.body.setUserData(this); this.body.setUserData(this);
} }
public void init(Vector2 position, Vector2 direction) {
this.body.setTransform(position, (float) (direction.angleRad() + Math.toRadians(270f)));
this.body.setLinearVelocity(direction.nor().scl(speed));
}
public void reset() {
timeAlive = 0f;
markedToDestroy = false;
this.body.setLinearVelocity(Vector2.Zero);
this.body.setTransform(Vector2.Zero, 0f);
}
@Override @Override
public void render() { public void render() {
sprite.setOrigin(size / 2, size / 2); sprite.setOrigin(size / 2, size / 2);

View File

@@ -25,16 +25,16 @@ public class CleanupHandler {
public void tryClean() { public void tryClean() {
Array<Entity> entities = entitiesToDestroy; Array<Entity> entities = entitiesToDestroy;
Array<Projectile> projectiles = ProjectileHandler.getInstance().getProjectiles(); //Array<Projectile> projectiles = ProjectileHandler.getInstance().getDeployedProjectiles();
List<EnemyEntity> enemies = EnemyHandler.getInstance().getEnemies(); List<EnemyEntity> enemies = EnemyHandler.getInstance().getEnemies();
World world = Bugger.getInstance().getWorld(); World world = Bugger.getInstance().getWorld();
for (Entity entity : entities) { for (Entity entity : entities) {
world.destroyBody(entity.getBody()); world.destroyBody(entity.getBody());
if (entity instanceof Projectile) { // if (entity instanceof Projectile) {
projectiles.removeValue((Projectile) entity, true); // projectiles.removeValue((Projectile) entity, true);
} // }
if (entity instanceof EnemyEntity) { if (entity instanceof EnemyEntity) {
ParticleHandler.getInstance().playEffect(entity.getBody().getPosition().x, entity.getBody().getPosition().y); ParticleHandler.getInstance().playEffect(entity.getBody().getPosition().x, entity.getBody().getPosition().y);

View File

@@ -18,7 +18,7 @@ public class InputHandler {
} }
public void handleInput() { public void handleInput() {
if (Gdx.input.isButtonPressed(Input.Buttons.LEFT)) { if (Gdx.input.isButtonJustPressed(Input.Buttons.LEFT)) {
ProjectileHandler.getInstance().shootRay(); ProjectileHandler.getInstance().shootRay();
} }

View File

@@ -27,7 +27,7 @@ public class InterfaceHandler {
OrthographicCamera uiCam = CameraHandler.getInstance().getUICamera(); OrthographicCamera uiCam = CameraHandler.getInstance().getUICamera();
int kills = Bugger.kills; int kills = Bugger.kills;
int enemies = EnemyHandler.getInstance().getEnemies().size(); int enemies = EnemyHandler.getInstance().getEnemies().size();
int projectiles = ProjectileHandler.getInstance().getProjectiles().size; int projectiles = ProjectileHandler.getInstance().getDeployedProjectiles().size;
int bodies = Bugger.getInstance().getWorld().getBodyCount(); int bodies = Bugger.getInstance().getWorld().getBodyCount();
uiBatch.begin(); uiBatch.begin();

View File

@@ -6,14 +6,20 @@ import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import org.lumijiez.bugger.Bugger; import org.lumijiez.bugger.Bugger;
import org.lumijiez.bugger.entities.Player; import org.lumijiez.bugger.entities.Player;
import org.lumijiez.bugger.entities.weapons.Projectile;
import org.lumijiez.bugger.entities.weapons.Ray; import org.lumijiez.bugger.entities.weapons.Ray;
public class ProjectileHandler { public class ProjectileHandler {
private final Array<Projectile> projectiles = new Array<>(); private final Array<Ray> deployedProjectiles = new Array<>();
private final Array<Ray> freeProjectiles = new Array<>();
private static ProjectileHandler instance; private static ProjectileHandler instance;
private ProjectileHandler() {} private static final int INITIAL_PROJECTILES = 50;
private ProjectileHandler() {
for (int i = 0; i < INITIAL_PROJECTILES; i++) {
freeProjectiles.add(new Ray(Bugger.getInstance().getWorld()));
}
}
public static ProjectileHandler getInstance() { public static ProjectileHandler getInstance() {
if (instance == null) { if (instance == null) {
@@ -23,12 +29,16 @@ public class ProjectileHandler {
} }
public void cycle(float delta) { public void cycle(float delta) {
for (Projectile arrow : projectiles) { for (int i = 0; i < deployedProjectiles.size; i++) {
if (!arrow.isMarkedToDestroy()) { Ray ray = deployedProjectiles.get(i);
arrow.update(delta); if (!ray.isMarkedToDestroy()) {
arrow.render(); ray.update(delta);
ray.render();
} else { } else {
CleanupHandler.getInstance().getEntitiesToDestroy().add(arrow); ray.reset();
freeProjectiles.add(ray);
deployedProjectiles.removeIndex(i);
i--;
} }
} }
} }
@@ -44,15 +54,26 @@ public class ProjectileHandler {
Vector2 playerPos = Player.getInstance().getPosition(); Vector2 playerPos = Player.getInstance().getPosition();
direction.set(mousePosition.x, mousePosition.y).sub(playerPos).nor(); direction.set(mousePosition.x, mousePosition.y).sub(playerPos).nor();
projectiles.add(new Ray(Bugger.getInstance().getWorld(), playerPos, direction)); shootRay(playerPos, direction, 20f);
} }
public void shootRay(Vector2 position, Vector2 direction, float speed) { public void shootRay(Vector2 position, Vector2 direction, float speed) {
projectiles.add(new Ray(Bugger.getInstance().getWorld(), position, direction, speed)); Ray projectile;
if (freeProjectiles.size > 0) {
projectile = freeProjectiles.pop();
} else if (deployedProjectiles.size > 0) {
projectile = deployedProjectiles.first();
deployedProjectiles.removeIndex(0);
} else {
return;
} }
projectile.init(position, direction.nor().scl(speed));
deployedProjectiles.add(projectile);
}
public Array<Projectile> getProjectiles() { public Array<Ray> getDeployedProjectiles() {
return projectiles; return deployedProjectiles;
} }
} }