From bcdd4705673f281cd33d97c3c64a03c2e0b7aa9f Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sat, 17 Jul 2021 00:29:09 -0400 Subject: [PATCH] Improve biome generator performance (sync) efficiency --- .../core/command/world/CommandIrisCreate.java | 2 +- .../engine/actuator/IrisBiomeActuator.java | 13 +++++----- .../volmit/iris/engine/object/IrisBiome.java | 26 ++++++++++++++++++- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java index 993e4ad96..8afac01ac 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java @@ -179,7 +179,7 @@ public class CommandIrisCreate extends MortarCommand { }); }); }; - + if (multiverse) { dim = IrisDataManager.loadAnyDimension(type); diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java b/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java index cf57eecb9..5e9a9dd89 100644 --- a/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java +++ b/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java @@ -62,13 +62,14 @@ public class IrisBiomeActuator extends EngineAssignedActuator { @Override public void onActuate(int x, int z, Hunk h) { PrecisionStopwatch p = PrecisionStopwatch.start(); - int zf; + int zf, maxHeight; + IrisBiome ib; for (int xf = 0; xf < h.getWidth(); xf++) { for (zf = 0; zf < h.getDepth(); zf++) { - IrisBiome ib = getComplex().getTrueBiomeStream().get(modX(xf + x), modZ(zf + z)); - + ib = getComplex().getTrueBiomeStream().get(modX(xf + x), modZ(zf + z)); + maxHeight = (int) (getComplex().getFluidHeight() + ib.getMaxWithObjectHeight(getData())); if (ib.isCustom()) { try { IrisBiomeCustom custom = ib.getCustomBiome(rng, x, 0, z); @@ -78,20 +79,20 @@ public class IrisBiomeActuator extends EngineAssignedActuator { throw new RuntimeException("Cant inject biome!"); } - for (int i = 0; i < h.getHeight(); i++) { + for (int i = 0; i < maxHeight; i++) { injectBiome(h, xf, i, zf, biomeBase); } } catch (Throwable e) { Iris.reportError(e); e.printStackTrace(); Biome v = ib.getSkyBiome(rng, x, 0, z); - for (int i = 0; i < h.getHeight(); i++) { + for (int i = 0; i < maxHeight; i++) { h.set(xf, i, zf, v); } } } else { Biome v = ib.getSkyBiome(rng, x, 0, z); - for (int i = 0; i < h.getHeight(); i++) { + for (int i = 0; i < maxHeight; i++) { h.set(xf, i, zf, v); } } diff --git a/src/main/java/com/volmit/iris/engine/object/IrisBiome.java b/src/main/java/com/volmit/iris/engine/object/IrisBiome.java index 57eb56674..03a76683e 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisBiome.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisBiome.java @@ -212,6 +212,7 @@ public class IrisBiome extends IrisRegistrant implements IRare { private final transient AtomicCache childrenCell = new AtomicCache<>(); private final transient AtomicCache biomeGenerator = new AtomicCache<>(); private final transient AtomicCache maxHeight = new AtomicCache<>(); + private final transient AtomicCache maxWithObjectHeight = new AtomicCache<>(); private final transient AtomicCache realCarveBiome = new AtomicCache<>(); private final transient AtomicCache> realChildren = new AtomicCache<>(); private final transient AtomicCache> layerHeightGenerators = new AtomicCache<>(); @@ -425,7 +426,7 @@ public class IrisBiome extends IrisRegistrant implements IRare { return real; } - private int getMaxHeight() { + public int getMaxHeight() { return maxHeight.aquire(() -> { int maxHeight = 0; @@ -438,6 +439,29 @@ public class IrisBiome extends IrisRegistrant implements IRare { }); } + public int getMaxWithObjectHeight(IrisDataManager data) { + return maxWithObjectHeight.aquire(() -> + { + int maxHeight = 0; + + for (IrisBiomeGeneratorLink i : getGenerators()) { + maxHeight += i.getMax(); + } + + int gg = 0; + + for(IrisObjectPlacement i : getObjects()) + { + for(IrisObject j : data.getObjectLoader().loadAll(i.getPlace())) + { + gg = Math.max(gg, j.getH()); + } + } + + return maxHeight + gg+3; + }); + } + public IrisBiome infer(InferredType t, InferredType type) { setInferredType(t.equals(InferredType.DEFER) ? type : t); return this;