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 {
private float timeAlive = 0f;
protected float timeAlive = 0f;
public Projectile(World world, String texturePath, float size) {
super(world, texturePath, size);
@@ -61,4 +61,9 @@ public abstract class Projectile extends Entity {
public void 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;
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) {
super(world, position, direction, "images/blaze.png", 5f);
this.body.setUserData(this);
}
public Ray(World world, Vector2 position, Vector2 direction, float speed) {
super(world, position, direction, "images/blaze.png", 5f, speed);
this.speed = speed;
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
public void render() {
sprite.setOrigin(size / 2, size / 2);

View File

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

View File

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

View File

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

View File

@@ -6,14 +6,20 @@ import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.utils.Array;
import org.lumijiez.bugger.Bugger;
import org.lumijiez.bugger.entities.Player;
import org.lumijiez.bugger.entities.weapons.Projectile;
import org.lumijiez.bugger.entities.weapons.Ray;
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 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() {
if (instance == null) {
@@ -23,12 +29,16 @@ public class ProjectileHandler {
}
public void cycle(float delta) {
for (Projectile arrow : projectiles) {
if (!arrow.isMarkedToDestroy()) {
arrow.update(delta);
arrow.render();
for (int i = 0; i < deployedProjectiles.size; i++) {
Ray ray = deployedProjectiles.get(i);
if (!ray.isMarkedToDestroy()) {
ray.update(delta);
ray.render();
} 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();
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) {
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() {
return projectiles;
public Array<Ray> getDeployedProjectiles() {
return deployedProjectiles;
}
}