From 487dab793abc43416d69ea1ce44f86eca04c6ed8 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sat, 17 Jul 2021 03:20:10 -0400 Subject: [PATCH] Performance Improvements --- .../volmit/iris/core/gui/Pregenerator.java | 2 +- .../com/volmit/iris/engine/IrisEngine.java | 6 ++++- .../actuator/IrisTerrainNormalActuator.java | 1 - .../iris/engine/framework/EngineTarget.java | 1 - .../engine/hunk/io/PaletteHunkIOAdapter.java | 8 +++++++ .../iris/engine/parallax/ParallaxRegion.java | 5 ++++ .../iris/engine/parallax/ParallaxWorld.java | 5 +++- .../iris/engine/parallel/MultiBurst.java | 19 +++++++++++---- .../com/volmit/iris/util/scheduling/J.java | 23 ++++--------------- 9 files changed, 42 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/gui/Pregenerator.java b/src/main/java/com/volmit/iris/core/gui/Pregenerator.java index 01852e71e..d8f9242ad 100644 --- a/src/main/java/com/volmit/iris/core/gui/Pregenerator.java +++ b/src/main/java/com/volmit/iris/core/gui/Pregenerator.java @@ -133,7 +133,7 @@ public class Pregenerator implements Listener { this.directWriter = new DirectWorldWriter(world.getWorldFolder()); this.running = new AtomicBoolean(true); this.active = new AtomicBoolean(true); - MultiBurst burst = new MultiBurst(Runtime.getRuntime().availableProcessors()); + MultiBurst burst = new MultiBurst("Iris Pregenerator", 9, Runtime.getRuntime().availableProcessors() + 4); int mcaSize = (((blockSize >> 4) + 2) >> 5) + 1; onComplete = new KList<>(); max = new ChunkPosition(0, 0); diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index 2a8991f9b..706cd477b 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -25,6 +25,9 @@ import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisBiomePaletteLayer; import com.volmit.iris.engine.object.IrisDecorator; import com.volmit.iris.engine.object.IrisObjectPlacement; +import com.volmit.iris.engine.parallel.MultiBurst; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.format.Form; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.PrecisionStopwatch; @@ -38,6 +41,8 @@ import org.bukkit.generator.BlockPopulator; import org.jetbrains.annotations.NotNull; import java.util.Random; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; public class IrisEngine extends BlockPopulator implements Engine { @Getter @@ -159,7 +164,6 @@ public class IrisEngine extends BlockPopulator implements Engine { PrecisionStopwatch p = PrecisionStopwatch.start(); Hunk blocks = vblocks; - switch (getDimension().getTerrainMode()) { case NORMAL -> { getFramework().getEngineParallax().generateParallaxArea(x >> 4, z >> 4); diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java b/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java index cce03edc3..b06397c27 100644 --- a/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java +++ b/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java @@ -54,7 +54,6 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator IrisBiome biome; KList blocks, fblocks; - for (int xf = 0; xf < h.getWidth(); xf++) { for (zf = 0; zf < h.getDepth(); zf++) { realX = (int) modX(xf + x); diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java b/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java index 21d2bff12..bdd833b0b 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java @@ -42,7 +42,6 @@ public class EngineTarget { this.height = height; this.dimension = dimension; this.data = data; - // TODO: WARNING HEIGHT this.parallaxWorld = new ParallaxWorld(256, new File(world.getWorldFolder(), "iris/" + dimension.getLoadKey() + "/parallax")); this.inverted = inverted; this.burster = new MultiBurst(threads); diff --git a/src/main/java/com/volmit/iris/engine/hunk/io/PaletteHunkIOAdapter.java b/src/main/java/com/volmit/iris/engine/hunk/io/PaletteHunkIOAdapter.java index 987dc26b5..4cec78865 100644 --- a/src/main/java/com/volmit/iris/engine/hunk/io/PaletteHunkIOAdapter.java +++ b/src/main/java/com/volmit/iris/engine/hunk/io/PaletteHunkIOAdapter.java @@ -44,6 +44,14 @@ public abstract class PaletteHunkIOAdapter implements HunkIOAdapter { } }); + for (int i = 0; i < t.getWidth(); i++) { + for (int j = 0; j < t.getHeight(); j++) { + for (int k = 0; k < t.getDepth(); k++) { + T w = t.get(i, j, k); + } + } + } + palette.write(this, dos); dos.writeInt(nonNull.get() + Integer.MIN_VALUE); AtomicBoolean failure = new AtomicBoolean(false); diff --git a/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java b/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java index 2efa35307..5af51d6dc 100644 --- a/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java +++ b/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java @@ -25,10 +25,13 @@ import com.volmit.iris.engine.hunk.io.HunkRegion; import com.volmit.iris.engine.hunk.io.HunkRegionSlice; import com.volmit.iris.engine.object.tile.TileData; import com.volmit.iris.engine.parallel.GridLock; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.format.Form; import com.volmit.iris.util.math.M; import com.volmit.iris.util.oldnbt.ByteArrayTag; import com.volmit.iris.util.oldnbt.CompoundTag; import com.volmit.iris.util.oldnbt.Tag; +import com.volmit.iris.util.scheduling.PrecisionStopwatch; import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; @@ -153,6 +156,7 @@ public class ParallaxRegion extends HunkRegion { } public synchronized void save() throws IOException { + PrecisionStopwatch p = PrecisionStopwatch.start(); blockSlice.save(); objectSlice.save(); entitySlice.save(); @@ -160,6 +164,7 @@ public class ParallaxRegion extends HunkRegion { updateSlice.save(); saveMetaHunk(); super.save(); + Iris.debug("Saved Parallax Region " + C.AQUA + getX() + "," + getZ() + C.LIGHT_PURPLE + " in " + C.RED + Form.duration(p.getMilliseconds(), 0)); } public int unload() { diff --git a/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java b/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java index f8cb0cc38..c05f91da7 100644 --- a/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java +++ b/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java @@ -22,8 +22,10 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.tile.TileData; +import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.scheduling.J; import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; @@ -232,11 +234,12 @@ public class ParallaxWorld implements ParallaxAccess { @Override public void saveAll() { - J.a(this::saveAllNOW); + MultiBurst.burst.lazy(this::saveAllNOW); } @Override public void saveAllNOW() { + Iris.debug("Saving " + C.GREEN + loadedRegions.size() + " Parallax Regions"); for (ParallaxRegion i : loadedRegions.v()) { if (save.contains(key(i.getX(), i.getZ()))) { save(i.getX(), i.getZ()); diff --git a/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java b/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java index aed2042f6..da965047b 100644 --- a/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java +++ b/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java @@ -21,18 +21,17 @@ package com.volmit.iris.engine.parallel; import com.volmit.iris.Iris; import com.volmit.iris.util.collection.KList; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; public class MultiBurst { - public static final MultiBurst burst = new MultiBurst("Iris Burster", 10, Runtime.getRuntime().availableProcessors()); + public static final MultiBurst burst = new MultiBurst("Iris", 6, Runtime.getRuntime().availableProcessors()); private final ExecutorService service; private ExecutorService syncService; private int tid; public MultiBurst(int tc) { - this("Iris Generator", 6, tc); + this("Iris", 6, tc); } public MultiBurst(String name, int priority, int tc) { @@ -73,10 +72,22 @@ public class MultiBurst { return burst(16); } + public Future lazySubmit(Callable o) { + return service.submit(o); + } + public void lazy(Runnable o) { service.execute(o); } + public Future future(Runnable o) { + return service.submit(o); + } + + public CompletableFuture complete(Runnable o) { + return CompletableFuture.runAsync(o, service); + } + public void shutdownNow() { service.shutdownNow().forEach(Runnable::run); } diff --git a/src/main/java/com/volmit/iris/util/scheduling/J.java b/src/main/java/com/volmit/iris/util/scheduling/J.java index 483a96d57..a9706c505 100644 --- a/src/main/java/com/volmit/iris/util/scheduling/J.java +++ b/src/main/java/com/volmit/iris/util/scheduling/J.java @@ -19,6 +19,7 @@ package com.volmit.iris.util.scheduling; import com.volmit.iris.Iris; +import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.function.NastyFunction; import com.volmit.iris.util.function.NastyFuture; @@ -34,22 +35,6 @@ import java.util.function.Supplier; @SuppressWarnings("ALL") public class J { private static int tid = 0; - private static final ExecutorService e = Executors.newCachedThreadPool(new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - tid++; - Thread t = new Thread(r); - t.setName("Iris Actuator " + tid); - t.setPriority(8); - t.setUncaughtExceptionHandler((et, e) -> - { - Iris.info("Exception encountered in " + et.getName()); - e.printStackTrace(); - }); - - return t; - } - }); public static void dofor(int a, Function c, int ch, Consumer d) { for (int i = a; c.apply(i); i += ch) { @@ -73,7 +58,7 @@ public class J { } public static void arun(Runnable a) { - e.submit(() -> { + MultiBurst.burst.lazy(() -> { try { a.run(); } catch (Throwable e) { @@ -85,7 +70,7 @@ public class J { } public static void a(Runnable a) { - e.submit(() -> { + MultiBurst.burst.lazy(() -> { try { a.run(); } catch (Throwable e) { @@ -97,7 +82,7 @@ public class J { } public static Future a(Callable a) { - return e.submit(a); + return MultiBurst.burst.lazySubmit(a); } public static void attemptAsync(NastyRunnable r) {