9
0
mirror of https://github.com/VolmitSoftware/Iris.git synced 2025-12-28 11:39:07 +00:00

Stop blowing up the VM when looking for biomes

This commit is contained in:
Daniel Mills
2021-07-16 05:00:00 -04:00
parent e5cc9a3cbf
commit 9c376183e0
5 changed files with 52 additions and 20 deletions

View File

@@ -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();

View File

@@ -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) {

View File

@@ -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<Integer> 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<Engine> 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> 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<Integer> 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<Engine> 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> 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();
}

View File

@@ -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<T> extends BasicStream<T> 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));
}