From 976cfdbbc241487382be7a9d58ae36d18d351a30 Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Sat, 18 Sep 2021 05:08:49 -0400 Subject: [PATCH] Performance improvements --- .../modifier/IrisPerfectionModifier.java | 100 ++++++++++-------- .../util/interpolation/IrisInterpolation.java | 5 - .../volmit/iris/util/nbt/mca/NBTWorld.java | 2 +- 3 files changed, 54 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/modifier/IrisPerfectionModifier.java b/src/main/java/com/volmit/iris/engine/modifier/IrisPerfectionModifier.java index 69698887d..953033149 100644 --- a/src/main/java/com/volmit/iris/engine/modifier/IrisPerfectionModifier.java +++ b/src/main/java/com/volmit/iris/engine/modifier/IrisPerfectionModifier.java @@ -22,12 +22,15 @@ import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.EngineAssignedModifier; import com.volmit.iris.util.data.B; import com.volmit.iris.util.hunk.Hunk; +import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import org.bukkit.block.data.Bisected; import org.bukkit.block.data.BlockData; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; public class IrisPerfectionModifier extends EngineAssignedModifier { private static final BlockData AIR = B.get("AIR"); @@ -40,76 +43,79 @@ public class IrisPerfectionModifier extends EngineAssignedModifier { @Override public void onModify(int x, int z, Hunk output, boolean multicore) { PrecisionStopwatch p = PrecisionStopwatch.start(); - boolean changed = true; + AtomicBoolean changed = new AtomicBoolean(true); int passes = 0; - int changes = 0; + AtomicInteger changes = new AtomicInteger(); List surfaces = new ArrayList<>(); List ceilings = new ArrayList<>(); - - while (changed) { + BurstExecutor burst = burst().burst(multicore); + while (changed.get()) { passes++; - changed = false; + changed.set(false); for (int i = 0; i < 16; i++) { - for (int j = 0; j < 16; j++) { - surfaces.clear(); - ceilings.clear(); - int top = getHeight(output, i, j); - boolean inside = true; - surfaces.add(top); + int finalI = i; + burst.queue(() -> { + for (int j = 0; j < 16; j++) { + surfaces.clear(); + ceilings.clear(); + int top = getHeight(output, finalI, j); + boolean inside = true; + surfaces.add(top); - for (int k = top; k >= 0; k--) { - BlockData b = output.get(i, k, j); - boolean now = b != null && !(B.isAir(b) || B.isFluid(b)); + for (int k = top; k >= 0; k--) { + BlockData b = output.get(finalI, k, j); + boolean now = b != null && !(B.isAir(b) || B.isFluid(b)); - if (now != inside) { - inside = now; + if (now != inside) { + inside = now; - if (inside) { - surfaces.add(k); - } else { - ceilings.add(k + 1); + if (inside) { + surfaces.add(k); + } else { + ceilings.add(k + 1); + } } } - } - for (int k : surfaces) { - BlockData tip = output.get(i, k, j); + for (int k : surfaces) { + BlockData tip = output.get(finalI, k, j); - if (tip == null) { - continue; - } + if (tip == null) { + continue; + } - boolean remove = false; - boolean remove2 = false; + boolean remove = false; + boolean remove2 = false; - if (B.isDecorant(tip)) { - BlockData bel = output.get(i, k - 1, j); + if (B.isDecorant(tip)) { + BlockData bel = output.get(finalI, k - 1, j); - if (bel == null) { - remove = true; - } else if (!B.canPlaceOnto(tip.getMaterial(), bel.getMaterial())) { - remove = true; - } else if (bel instanceof Bisected) { - BlockData bb = output.get(i, k - 2, j); - if (bb == null || !B.canPlaceOnto(bel.getMaterial(), bb.getMaterial())) { + if (bel == null) { remove = true; - remove2 = true; + } else if (!B.canPlaceOnto(tip.getMaterial(), bel.getMaterial())) { + remove = true; + } else if (bel instanceof Bisected) { + BlockData bb = output.get(finalI, k - 2, j); + if (bb == null || !B.canPlaceOnto(bel.getMaterial(), bb.getMaterial())) { + remove = true; + remove2 = true; + } } - } - if (remove) { - changed = true; - changes++; - output.set(i, k, j, AIR); + if (remove) { + changed.set(true); + changes.getAndIncrement(); + output.set(finalI, k, j, AIR); - if (remove2) { - changes++; - output.set(i, k - 1, j, AIR); + if (remove2) { + changes.getAndIncrement(); + output.set(finalI, k - 1, j, AIR); + } } } } } - } + }); } } diff --git a/src/main/java/com/volmit/iris/util/interpolation/IrisInterpolation.java b/src/main/java/com/volmit/iris/util/interpolation/IrisInterpolation.java index ef9067da9..f759244da 100644 --- a/src/main/java/com/volmit/iris/util/interpolation/IrisInterpolation.java +++ b/src/main/java/com/volmit/iris/util/interpolation/IrisInterpolation.java @@ -316,11 +316,6 @@ public class IrisInterpolation { System.out.println(m + ": " + Form.duration(p.getMilliseconds(), 8)); } - public static void main(String[] args) { - printOptimizedSrc(false); - - } - public static void printOptimizedSrc(boolean arrays) { System.out.println(generateOptimizedStarcast(3, arrays)); System.out.println(generateOptimizedStarcast(5, arrays)); diff --git a/src/main/java/com/volmit/iris/util/nbt/mca/NBTWorld.java b/src/main/java/com/volmit/iris/util/nbt/mca/NBTWorld.java index 8bd01c6b5..a1c8072b6 100644 --- a/src/main/java/com/volmit/iris/util/nbt/mca/NBTWorld.java +++ b/src/main/java/com/volmit/iris/util/nbt/mca/NBTWorld.java @@ -117,7 +117,7 @@ public class NBTWorld { } public static CompoundTag getCompound(BlockData bd) { - return blockDataCache.computeIfAbsent(bd, BLOCK_DATA_COMPUTE).clone(); + return blockDataCache.computeIfAbsent(bd, BLOCK_DATA_COMPUTE); } private static Map computeBiomeIDs() {