From 9c376183e060d5ca49c6ef0b2250c7d5feacbcd7 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Fri, 16 Jul 2021 05:00:00 -0400 Subject: [PATCH] Stop blowing up the VM when looking for biomes --- .../command/studio/CommandIrisStudioGoto.java | 17 ++++++++-- .../com/volmit/iris/engine/IrisComplex.java | 5 ++- .../framework/EngineCompositeGenerator.java | 12 +++---- .../iris/engine/framework/IrisAccess.java | 32 +++++++++++++------ .../engine/stream/utility/CachedStream2D.java | 6 ++++ 5 files changed, 52 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioGoto.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioGoto.java index f784bc797..172f4aafb 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioGoto.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioGoto.java @@ -28,7 +28,7 @@ import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.plugin.MortarCommand; -import com.volmit.iris.util.plugin.MortarSender; +import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.scheduling.J; import org.bukkit.Location; import org.bukkit.World; @@ -37,8 +37,11 @@ import org.bukkit.entity.Player; import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; public class CommandIrisStudioGoto extends MortarCommand { + private static final AtomicBoolean looking = new AtomicBoolean(false); + public CommandIrisStudioGoto() { super("goto", "find", "g"); setDescription("Find any region or biome"); @@ -47,7 +50,7 @@ public class CommandIrisStudioGoto extends MortarCommand { } @Override - public void addTabOptions(MortarSender sender, String[] args, KList list) { + public void addTabOptions(VolmitSender sender, String[] args, KList list) { if (args.length == 0 && sender.isPlayer() && IrisWorlds.isIrisWorld(sender.player().getWorld())) { IrisDataManager data = IrisWorlds.access(sender.player().getWorld()).getData(); if (data == null) { @@ -61,7 +64,7 @@ public class CommandIrisStudioGoto extends MortarCommand { } @Override - public boolean handle(MortarSender sender, String[] args) { + public boolean handle(VolmitSender sender, String[] args) { try { if (args.length < 1) { sender.sendMessage("/iris std goto " + getArgsUsage()); @@ -69,6 +72,11 @@ public class CommandIrisStudioGoto extends MortarCommand { } if (sender.isPlayer()) { + if(looking.get()) + { + sender.sendMessage("A Search is already running, please wait!"); + } + Player p = sender.player(); World world = p.getWorld(); @@ -81,10 +89,12 @@ public class CommandIrisStudioGoto extends MortarCommand { IrisBiome b = IrisDataManager.loadAnyBiome(args[0]); IrisRegion r = IrisDataManager.loadAnyRegion(args[0]); + looking.set(true); if (b != null) { J.a(() -> { Location l = g.lookForBiome(b, 10000, (v) -> sender.sendMessage("Looking for " + C.BOLD + C.WHITE + b.getName() + C.RESET + C.GRAY + ": Checked " + Form.f(v) + " Places")); + looking.set(false); if (l == null) { sender.sendMessage("Couldn't find " + b.getName() + "."); } else { @@ -96,6 +106,7 @@ public class CommandIrisStudioGoto extends MortarCommand { J.a(() -> { Location l = g.lookForRegion(r, 60000, (v) -> sender.sendMessage(C.BOLD + "" + C.WHITE + r.getName() + C.RESET + C.GRAY + ": Checked " + Form.f(v) + " Places")); + looking.set(false); if (l == null) { sender.sendMessage("Couldn't find " + r.getName() + "."); } else { diff --git a/src/main/java/com/volmit/iris/engine/IrisComplex.java b/src/main/java/com/volmit/iris/engine/IrisComplex.java index 434fb6a82..8b8d499ef 100644 --- a/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -39,8 +39,11 @@ import org.bukkit.Material; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; +import java.util.concurrent.atomic.AtomicBoolean; + @Data public class IrisComplex implements DataProvider { + public static AtomicBoolean cacheLock = new AtomicBoolean(false); private RNG rng; private double fluidHeight; private IrisDataManager data; @@ -100,7 +103,7 @@ public class IrisComplex implements DataProvider { } public IrisComplex(Engine engine, boolean simple) { - int cacheSize = IrisSettings.get().getCache().getStreamingCacheSize(); + int cacheSize = 1024; this.rng = new RNG(engine.getWorld().getSeed()); this.data = engine.getData(); double height = engine.getHeight(); 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 dfbb3d378..729965bb2 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -40,7 +40,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.fakenews.FakeWorld; import com.volmit.iris.util.io.ReactiveFolder; import com.volmit.iris.util.math.M; -import com.volmit.iris.util.plugin.MortarSender; +import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.reflect.V; import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; @@ -117,7 +117,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce J.s(() -> { try { for (Player i : getTarget().getWorld().getPlayers()) { - new MortarSender(i, Iris.instance.getTag()).sendMessage("Dimension Hotloaded"); + new VolmitSender(i, Iris.instance.getTag()).sendMessage("Dimension Hotloaded"); i.playSound(i.getLocation(), Sound.BLOCK_COPPER_PLACE, 1f, 1.25f); } } catch (Throwable e) { @@ -195,7 +195,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce dim = IrisDataManager.loadAnyDimension(query); if (dim == null) { - Iris.proj.downloadSearch(new MortarSender(Bukkit.getConsoleSender(), Iris.instance.getTag()), query, false); + Iris.proj.downloadSearch(new VolmitSender(Bukkit.getConsoleSender(), Iris.instance.getTag()), query, false); dim = IrisDataManager.loadAnyDimension(query); if (dim == null) { @@ -211,7 +211,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce if (dim == null) { Iris.info("Installing Iris pack " + od.getName() + " into world " + world.getName() + "..."); - Iris.proj.installIntoWorld(new MortarSender(Bukkit.getConsoleSender(), Iris.instance.getTag()), od.getLoadKey(), world.getWorldFolder()); + Iris.proj.installIntoWorld(new VolmitSender(Bukkit.getConsoleSender(), Iris.instance.getTag()), od.getLoadKey(), world.getWorldFolder()); dim = new IrisDataManager(getDataFolder(world)).getDimensionLoader().load(od.getLoadKey()); if (dim == null) { @@ -261,7 +261,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce dim = IrisDataManager.loadAnyDimension(query); if (dim == null) { - Iris.proj.downloadSearch(new MortarSender(Bukkit.getConsoleSender(), Iris.instance.getTag()), query, false); + Iris.proj.downloadSearch(new VolmitSender(Bukkit.getConsoleSender(), Iris.instance.getTag()), query, false); dim = IrisDataManager.loadAnyDimension(query); if (dim == null) { @@ -277,7 +277,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce if (dim == null) { Iris.info("Installing Iris pack " + od.getName() + " into world " + world + "..."); - Iris.proj.installIntoWorld(new MortarSender(Bukkit.getConsoleSender(), Iris.instance.getTag()), od.getLoadKey(), new File(world)); + Iris.proj.installIntoWorld(new VolmitSender(Bukkit.getConsoleSender(), Iris.instance.getTag()), od.getLoadKey(), new File(world)); dim = new IrisDataManager(getDataFolder(world)).getDimensionLoader().load(od.getLoadKey()); if (dim == null) { diff --git a/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java b/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java index fe5e408c6..bfd86c43b 100644 --- a/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java +++ b/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java @@ -20,6 +20,7 @@ package com.volmit.iris.engine.framework; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisDataManager; +import com.volmit.iris.engine.IrisComplex; import com.volmit.iris.engine.data.DataProvider; import com.volmit.iris.engine.data.DirectWorldWriter; import com.volmit.iris.engine.object.IrisBiome; @@ -86,9 +87,10 @@ public interface IrisAccess extends Hotloadable, DataProvider { boolean isStudio(); default Location lookForBiome(IrisBiome biome, long timeout, Consumer triesc) { + IrisComplex.cacheLock.set(true); ChronoLatch cl = new ChronoLatch(250, false); long s = M.ms(); - int cpus = 2 + (Runtime.getRuntime().availableProcessors() / 2); + int cpus = (Runtime.getRuntime().availableProcessors()); KList engines = new KList<>(); for (int i = 0; i < getCompound().getSize(); i++) { Engine e = getCompound().getEngine(i); @@ -98,29 +100,28 @@ public interface IrisAccess extends Hotloadable, DataProvider { } if (engines.isEmpty()) { + IrisComplex.cacheLock.set(false); return null; } AtomicInteger tries = new AtomicInteger(0); AtomicBoolean found = new AtomicBoolean(false); + AtomicBoolean running = new AtomicBoolean(true); AtomicReference location = new AtomicReference<>(); - for (int i = 0; i < cpus; i++) { J.a(() -> { try { Engine e; IrisBiome b; - int x, y, z; + int x, z; - while (!found.get()) { + while (!found.get() && running.get()) { try { synchronized (engines) { e = engines.getRandom(); x = RNG.r.i(-29999970, 29999970); - y = RNG.r.i(0, e.getHeight() - 1); z = RNG.r.i(-29999970, 29999970); - - b = e.getBiome(x, y, z); + b = e.getSurfaceBiome(x, z); } if (b != null && b.getLoadKey() == null) { @@ -129,7 +130,7 @@ public interface IrisAccess extends Hotloadable, DataProvider { if (b != null && b.getLoadKey().equals(biome.getLoadKey())) { found.lazySet(true); - location.lazySet(new Location(e.getWorld(), x, y, z)); + location.lazySet(new Location(e.getWorld(), x, e.getHeight(x, z), z)); } tries.getAndIncrement(); @@ -154,17 +155,22 @@ public interface IrisAccess extends Hotloadable, DataProvider { } if (M.ms() - s > timeout) { + running.set(false); + IrisComplex.cacheLock.set(false); return null; } } + IrisComplex.cacheLock.set(false); + running.set(false); return location.get(); } default Location lookForRegion(IrisRegion reg, long timeout, Consumer triesc) { + IrisComplex.cacheLock.set(true); ChronoLatch cl = new ChronoLatch(3000, false); long s = M.ms(); - int cpus = 2 + (Runtime.getRuntime().availableProcessors() / 2); + int cpus = (Runtime.getRuntime().availableProcessors()); KList engines = new KList<>(); for (int i = 0; i < getCompound().getSize(); i++) { Engine e = getCompound().getEngine(i); @@ -174,11 +180,13 @@ public interface IrisAccess extends Hotloadable, DataProvider { } if (engines.isEmpty()) { + IrisComplex.cacheLock.set(false); return null; } AtomicInteger tries = new AtomicInteger(0); AtomicBoolean found = new AtomicBoolean(false); + AtomicBoolean running = new AtomicBoolean(true); AtomicReference location = new AtomicReference<>(); for (int i = 0; i < cpus; i++) { @@ -187,7 +195,7 @@ public interface IrisAccess extends Hotloadable, DataProvider { IrisRegion b; int x, z; - while (!found.get()) { + while (!found.get() && running.get()) { try { e = engines.getRandom(); x = RNG.r.i(-29999970, 29999970); @@ -218,11 +226,15 @@ public interface IrisAccess extends Hotloadable, DataProvider { if (M.ms() - s > timeout) { triesc.accept(tries.get()); + running.set(false); + IrisComplex.cacheLock.set(false); return null; } } triesc.accept(tries.get()); + IrisComplex.cacheLock.set(false); + running.set(false); return location.get(); } diff --git a/src/main/java/com/volmit/iris/engine/stream/utility/CachedStream2D.java b/src/main/java/com/volmit/iris/engine/stream/utility/CachedStream2D.java index 6037c40aa..9b684358a 100644 --- a/src/main/java/com/volmit/iris/engine/stream/utility/CachedStream2D.java +++ b/src/main/java/com/volmit/iris/engine/stream/utility/CachedStream2D.java @@ -19,6 +19,7 @@ package com.volmit.iris.engine.stream.utility; import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap; +import com.volmit.iris.engine.IrisComplex; import com.volmit.iris.engine.cache.Cache; import com.volmit.iris.engine.stream.BasicStream; import com.volmit.iris.engine.stream.ProceduralStream; @@ -49,6 +50,11 @@ public class CachedStream2D extends BasicStream implements ProceduralStrea @Override public T get(double x, double z) { + if(IrisComplex.cacheLock.get()) + { + return stream.get((int) x, (int) z); + } + return cache.compute(Cache.key((int) x, (int) z), (k, v) -> v != null ? v : stream.get((int) x, (int) z)); }