diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 4dd11a222..fa652ee8f 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -155,30 +155,6 @@ public class Iris extends VolmitPlugin implements Listener { Iris.info("Data Packs Setup!"); } - public static int getThreadCount() { - int tc = IrisSettings.get().getConcurrency().getThreadCount(); - - if (tc <= 0) { - int p = Runtime.getRuntime().availableProcessors(); - - return p > 16 ? 16 : Math.max(p, 4); - } - - return tc; - } - - private static boolean doesSupport3DBiomes() { - try { - int v = Integer.parseInt(Bukkit.getBukkitVersion().split("\\Q-\\E")[0].split("\\Q.\\E")[1]); - - return v >= 15; - } catch (Throwable e) { - Iris.reportError(e); - } - - return false; - } - private static boolean doesSupportCustomModels() { try { int v = Integer.parseInt(Bukkit.getBukkitVersion().split("\\Q-\\E")[0].split("\\Q.\\E")[1]); diff --git a/src/main/java/com/volmit/iris/core/IrisSettings.java b/src/main/java/com/volmit/iris/core/IrisSettings.java index 40d625e93..41cf00626 100644 --- a/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -56,14 +56,25 @@ public class IrisSettings { return getParallax().getParallaxRegionEvictionMS(); } + public static int getThreadCount(int c) + { + if(c < 2 && c >= 0) + { + return 2; + } + + return c < 0 ? Runtime.getRuntime().availableProcessors() / -c : c; + } + @Data public static class IrisSettingsCache { - public int streamingCacheSize = 8192; + public int complexCacheSize = 131072; } @Data public static class IrisSettingsConcurrency { public int threadCount = -1; + public int pregenThreadCount = -1; } @Data @@ -100,7 +111,6 @@ public class IrisSettings { public boolean systemEntitySpawnOverrides = true; public boolean systemEntityInitialSpawns = true; public int maxBiomeChildDepth = 5; - } @Data diff --git a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java index b483e7dce..41bd8edc9 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -18,6 +18,7 @@ package com.volmit.iris.core.pregenerator; +import com.volmit.iris.Iris; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.math.M; @@ -96,6 +97,7 @@ public class IrisPregenerator { generated.get(), totalChunks.get(), totalChunks.get() - generated.get(), eta, M.ms() - startTime.get(), currentGeneratorMethod.get()); + return 1000; } }; diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java similarity index 87% rename from src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java rename to src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java index 8ac69148e..5ab362ea4 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java @@ -23,12 +23,12 @@ import com.volmit.iris.core.pregenerator.PregeneratorMethod; import io.papermc.lib.PaperLib; import org.bukkit.World; -public class PaperOrMedievalPregenMethod implements PregeneratorMethod { +public class AsyncOrMedievalPregenMethod implements PregeneratorMethod { private final PregeneratorMethod method; - public PaperOrMedievalPregenMethod(World world, int threads) + public AsyncOrMedievalPregenMethod(World world, int threads) { - method = PaperLib.isPaper() ? new PaperAsyncPregenMethod(world, threads) : new MedievalPregenMethod(world); + method = PaperLib.isPaper() ? new AsyncPregenMethod(world, threads) : new MedievalPregenMethod(world); } @Override diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java similarity index 92% rename from src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java rename to src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java index 2748edb45..b8ecabfba 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java @@ -18,6 +18,7 @@ package com.volmit.iris.core.pregenerator.methods; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregeneratorMethod; import com.volmit.iris.engine.parallel.MultiBurst; @@ -30,12 +31,12 @@ import org.bukkit.World; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -public class PaperAsyncPregenMethod implements PregeneratorMethod { +public class AsyncPregenMethod implements PregeneratorMethod { private final World world; private final MultiBurst burst; private final KList> future; - public PaperAsyncPregenMethod(World world, int threads) + public AsyncPregenMethod(World world, int threads) { if(!PaperLib.isPaper()) { @@ -119,7 +120,7 @@ public class PaperAsyncPregenMethod implements PregeneratorMethod { @Override public void generateChunk(int x, int z, PregenListener listener) { - if(future.size() > 16) + if(future.size() > IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount())) { waitForChunks(); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java index 89e0201e9..7d19d8660 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java @@ -38,7 +38,7 @@ public class HybridPregenMethod implements PregeneratorMethod { this.world = world; headless = supportsHeadless(world) ? new HeadlessPregenMethod(HeadlessWorld.from(world)) : new DummyPregenMethod(); - inWorld = new PaperOrMedievalPregenMethod(world, threads); + inWorld = new AsyncOrMedievalPregenMethod(world, threads); } private boolean supportsHeadless(World world) { diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java index 4dde03ea1..7f40cab66 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java @@ -18,6 +18,7 @@ package com.volmit.iris.core.pregenerator.methods; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregeneratorMethod; import com.volmit.iris.util.collection.KList; @@ -98,7 +99,7 @@ public class MedievalPregenMethod implements PregeneratorMethod { @Override public void generateChunk(int x, int z, PregenListener listener) { - if(futures.size() > 32) + if(futures.size() > IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount())) { waitForChunks(); } diff --git a/src/main/java/com/volmit/iris/engine/IrisComplex.java b/src/main/java/com/volmit/iris/engine/IrisComplex.java index 67a3b42e7..aa82f6338 100644 --- a/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -107,7 +107,7 @@ public class IrisComplex implements DataProvider { } public IrisComplex(Engine engine, boolean simple) { - int cacheSize = 1024 * 128; + int cacheSize = 131072; IrisBiome emptyBiome = new IrisBiome(); this.rng = new RNG(engine.getWorld().seed()); this.data = engine.getData(); diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index 9c2c26d55..c3e947c94 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -25,10 +25,7 @@ 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.documentation.ChunkCoordinates; -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; @@ -42,8 +39,6 @@ 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 diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index e983c2359..de2197794 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -302,7 +302,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce initialized.set(true); IrisDimension dim = getDimension(world); IrisDataManager data = production ? new IrisDataManager(getDataFolder(world)) : dim.getLoader().copy(); - compound.set(new IrisEngineCompound(world, dim, data, Iris.getThreadCount())); + compound.set(new IrisEngineCompound(world, dim, data, IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getThreadCount()))); compound.get().setStudio(!production); populators.clear(); populators.addAll(compound.get().getPopulators()); diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java b/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java index 70a7f0a73..1611bc460 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java @@ -272,7 +272,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { int i, j; KList after = new KList<>(); int bs = (int) Math.pow((s * 2) + 1, 2); - BurstExecutor burst = MultiBurst.burst.burst(bs); + BurstExecutor burst = getEngine().getTarget().getBurster().burst(bs); for (i = -s; i <= s; i++) { for (j = -s; j <= s; j++) { int xx = i + x; @@ -294,7 +294,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { burst.complete(); if (getEngine().getDimension().isPlaceObjects()) { - burst = MultiBurst.burst.burst(bs); + burst = getEngine().getTarget().getBurster().burst(bs); for (i = -s; i <= s; i++) { int ii = i; @@ -310,7 +310,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { } burst.complete(); - burst = MultiBurst.burst.burst(bs); + burst = getEngine().getTarget().getBurster().burst(bs); for (i = -s; i <= s; i++) { int ii = i; @@ -323,7 +323,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { burst.complete(); } - MultiBurst.burst.burst(after); + getEngine().getTarget().getBurster().burst(after); getParallaxAccess().setChunkGenerated(x, z); p.end(); getEngine().getMetrics().getParallax().put(p.getMilliseconds()); @@ -677,7 +677,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { } Iris.verbose("Checking sizes for " + Form.f(objects.size()) + " referenced objects."); - BurstExecutor e = MultiBurst.burst.burst(objects.size()); + BurstExecutor e = getEngine().getTarget().getBurster().burst(objects.size()); KMap sizeCache = new KMap<>(); for (String i : objects) { e.queue(() -> { 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 6c7f2856c..8ab725b11 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java @@ -42,9 +42,9 @@ public class EngineTarget { this.height = height; this.dimension = dimension; this.data = data; - this.parallaxWorld = new ParallaxWorld(256, new File(world.worldFolder(), "iris/" + dimension.getLoadKey() + "/parallax")); this.inverted = inverted; - this.burster = new MultiBurst(threads); + this.burster = new MultiBurst("Iris Engine " + dimension.getName(), threads, 6); + this.parallaxWorld = new ParallaxWorld(burster, 256, new File(world.worldFolder(), "iris/" + dimension.getLoadKey() + "/parallax")); } public EngineTarget(IrisWorld world, IrisDimension dimension, IrisDataManager data, int height, int threads) { diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java index 1d9327248..8a2396ca1 100644 --- a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java @@ -18,6 +18,7 @@ package com.volmit.iris.engine.headless; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.engine.data.mca.LoadFlags; import com.volmit.iris.engine.data.mca.MCAFile; @@ -43,7 +44,7 @@ public class HeadlessGenerator { public HeadlessGenerator(HeadlessWorld world) { this.world = world; - burst = new MultiBurst("Iris Headless Generator", 9, Runtime.getRuntime().availableProcessors()); + burst = new MultiBurst("Iris Headless Generator", 9, IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount())); writer = new NBTWorld(world.getWorld().worldFolder()); generator = new EngineCompositeGenerator(world.getDimension().getLoadKey(), !world.isStudio()); generator.assignHeadlessGenerator(this); diff --git a/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java b/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java index 283123819..0e857b632 100644 --- a/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java +++ b/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java @@ -98,8 +98,8 @@ public class HunkRegionSlice { } } - public synchronized void save() { - BurstExecutor e = MultiBurst.burst.burst(); + public synchronized void save(MultiBurst burst) { + BurstExecutor e = burst.burst(); try { diff --git a/src/main/java/com/volmit/iris/engine/lighting/LightingTaskBatch.java b/src/main/java/com/volmit/iris/engine/lighting/LightingTaskBatch.java index c95450ad9..042104afb 100644 --- a/src/main/java/com/volmit/iris/engine/lighting/LightingTaskBatch.java +++ b/src/main/java/com/volmit/iris/engine/lighting/LightingTaskBatch.java @@ -25,6 +25,7 @@ import com.bergerkiller.bukkit.common.utils.MathUtil; import com.bergerkiller.bukkit.common.utils.WorldUtil; import com.bergerkiller.bukkit.common.wrappers.LongHashSet; import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; import org.bukkit.Chunk; import org.bukkit.World; @@ -261,7 +262,7 @@ public class LightingTaskBatch implements LightingTask { LightingChunk nextChunk = null; CompletableFuture nextChunkFuture = null; synchronized (chunks_lock) { - for (; i < chunks.length && numBeingLoaded < Iris.getThreadCount(); i++) { + for (; i < chunks.length && numBeingLoaded < IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getThreadCount()); i++) { LightingChunk lc = chunks[i]; if (lc.loadingStarted) { continue; // Already (being) loaded 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 0a1f786b1..81b7fdf71 100644 --- a/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java +++ b/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java @@ -25,6 +25,7 @@ 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.engine.parallel.MultiBurst; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.math.M; @@ -50,16 +51,19 @@ public class ParallaxRegion extends HunkRegion { private final GridLock lock; private long lastUse; private final int height; + private final MultiBurst burst; - public ParallaxRegion(int height, File folder, int x, int z, CompoundTag compound) { + public ParallaxRegion(MultiBurst burst, int height, File folder, int x, int z, CompoundTag compound) { super(folder, x, z, compound); + this.burst = burst; this.height = height; setupSlices(); lock = new GridLock(32, 32); } - public ParallaxRegion(int height, File folder, int x, int z) { + public ParallaxRegion(MultiBurst burst, int height, File folder, int x, int z) { super(folder, x, z); + this.burst = burst; this.height = height; setupSlices(); lock = new GridLock(32, 32); @@ -155,12 +159,13 @@ public class ParallaxRegion extends HunkRegion { } } + @Override public synchronized void save() throws IOException { - blockSlice.save(); - objectSlice.save(); - entitySlice.save(); - tileSlice.save(); - updateSlice.save(); + blockSlice.save(burst); + objectSlice.save(burst); + entitySlice.save(burst); + tileSlice.save(burst); + updateSlice.save(burst); saveMetaHunk(); Iris.debug("Saved Parallax Region "+ C.GOLD + getX() + " " + getZ()); super.save(); 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 60f2b350b..68c797f3b 100644 --- a/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java +++ b/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java @@ -40,10 +40,12 @@ public class ParallaxWorld implements ParallaxAccess { private final KMap loadedRegions; private final KList save; private final File folder; + private final MultiBurst burst; private final int height; - public ParallaxWorld(int height, File folder) { + public ParallaxWorld(MultiBurst burst, int height, File folder) { this.height = height; + this.burst = burst; this.folder = folder; save = new KList<>(); loadedRegions = new KMap<>(); @@ -125,7 +127,7 @@ public class ParallaxWorld implements ParallaxAccess { return loadedRegions.get(key(x, z)); } - ParallaxRegion v = new ParallaxRegion(height, folder, x, z); + ParallaxRegion v = new ParallaxRegion(burst, height, folder, x, z); loadedRegions.put(key(x, z), v); return v;