diff --git a/build.gradle b/build.gradle index 8520dd45f..26bbcfa4f 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ plugins { } group 'com.volmit.iris' -version '1.8.13' +version '1.9-DangerouslyUnstable' def apiVersion = '1.17' def name = getRootProject().getName() // Defined in settings.gradle def main = 'com.volmit.iris.Iris' diff --git a/src/main/java/com/volmit/iris/core/IrisSettings.java b/src/main/java/com/volmit/iris/core/IrisSettings.java index bbe1c0787..66b5fc98b 100644 --- a/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -60,7 +60,7 @@ public class IrisSettings { @Data public static class IrisAsyncTeleport { - public boolean enabled = true; + public boolean enabled = false; public int loadViewDistance = 2; public boolean urgent = false; } diff --git a/src/main/java/com/volmit/iris/core/commands/CommandIris.java b/src/main/java/com/volmit/iris/core/commands/CommandIris.java index 92f9784a5..7bb133722 100644 --- a/src/main/java/com/volmit/iris/core/commands/CommandIris.java +++ b/src/main/java/com/volmit/iris/core/commands/CommandIris.java @@ -20,12 +20,15 @@ package com.volmit.iris.core.commands; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.core.service.PreservationSVC; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.platform.PlatformChunkGenerator; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.data.KCache; import com.volmit.iris.util.decree.DecreeContext; import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.DecreeOrigin; diff --git a/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java b/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java index ce553b5e6..5f03fbef3 100644 --- a/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java +++ b/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java @@ -364,6 +364,11 @@ public class ResourceLoader implements MeteredCache { return loadCache.getSize(); } + @Override + public KCache getRawCache() { + return loadCache; + } + @Override public long getMaxSize() { return loadCache.getMaxSize(); diff --git a/src/main/java/com/volmit/iris/core/service/PreservationSVC.java b/src/main/java/com/volmit/iris/core/service/PreservationSVC.java index 8c44e4a51..c6d57940b 100644 --- a/src/main/java/com/volmit/iris/core/service/PreservationSVC.java +++ b/src/main/java/com/volmit/iris/core/service/PreservationSVC.java @@ -25,6 +25,7 @@ import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.MeteredCache; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.context.IrisContext; +import com.volmit.iris.util.data.KCache; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.plugin.IrisService; @@ -36,6 +37,7 @@ import java.util.List; import java.util.Objects; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ExecutorService; +import java.util.stream.Collectors; public class PreservationSVC implements IrisService { private final List threads = new CopyOnWriteArrayList<>(); @@ -137,4 +139,8 @@ public class PreservationSVC implements IrisService { public void registerCache(MeteredCache cache) { caches.add(cache); } + + public List> caches() { + return caches.stream().map(MeteredCache::getRawCache).collect(Collectors.toList()); + } } diff --git a/src/main/java/com/volmit/iris/engine/IrisComplex.java b/src/main/java/com/volmit/iris/engine/IrisComplex.java index 93a79d6ec..69c054c7e 100644 --- a/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -124,7 +124,7 @@ public class IrisComplex implements DataProvider { Interpolated.of(a -> 0D, a -> focusRegion)) : regionStyleStream .selectRarity(engine.getDimension().getRegions(), (i) -> data.getRegionLoader().load(i)) - .convertCached((s) -> data.getRegionLoader().load(s)).cache2D(engine, cacheSize); + .convertCached((s) -> data.getRegionLoader().load(s)).cache2D("regionStream", engine, cacheSize); regionIDStream = regionIdentityStream.convertCached((i) -> new UUID(Double.doubleToLongBits(i), String.valueOf(i * 38445).hashCode() * 3245556666L)); caveBiomeStream = regionStream.convert((r) -> engine.getDimension().getCaveBiomeStyle().create(rng.nextParallelRNG(InferredType.CAVE.ordinal()), getData()).stream() @@ -139,7 +139,7 @@ public class IrisComplex implements DataProvider { return data.getBiomeLoader().load(s) .setInferredType(InferredType.CAVE); }) - ).convertAware2D(ProceduralStream::get).cache2D(engine, cacheSize); + ).convertAware2D(ProceduralStream::get).cache2D("caveBiomeStream", engine, cacheSize); inferredStreams.put(InferredType.CAVE, caveBiomeStream); landBiomeStream = regionStream.convert((r) -> engine.getDimension().getLandBiomeStyle().create(rng.nextParallelRNG(InferredType.LAND.ordinal()), getData()).stream() @@ -148,7 +148,7 @@ public class IrisComplex implements DataProvider { .convertCached((s) -> data.getBiomeLoader().load(s) .setInferredType(InferredType.LAND)) ).convertAware2D(ProceduralStream::get) - .cache2D(engine, cacheSize); + .cache2D("landBiomeStream", engine, cacheSize); inferredStreams.put(InferredType.LAND, landBiomeStream); seaBiomeStream = regionStream.convert((r) -> engine.getDimension().getSeaBiomeStyle().create(rng.nextParallelRNG(InferredType.SEA.ordinal()), getData()).stream() @@ -157,7 +157,7 @@ public class IrisComplex implements DataProvider { .convertCached((s) -> data.getBiomeLoader().load(s) .setInferredType(InferredType.SEA)) ).convertAware2D(ProceduralStream::get) - .cache2D(engine, cacheSize); + .cache2D("seaBiomeStream", engine, cacheSize); inferredStreams.put(InferredType.SEA, seaBiomeStream); shoreBiomeStream = regionStream.convert((r) -> engine.getDimension().getShoreBiomeStyle().create(rng.nextParallelRNG(InferredType.SHORE.ordinal()), getData()).stream() @@ -165,54 +165,54 @@ public class IrisComplex implements DataProvider { .selectRarity(r.getShoreBiomes(), (i) -> data.getBiomeLoader().load(i)) .convertCached((s) -> data.getBiomeLoader().load(s) .setInferredType(InferredType.SHORE)) - ).convertAware2D(ProceduralStream::get).cache2D(engine, cacheSize); + ).convertAware2D(ProceduralStream::get).cache2D("shoreBiomeStream", engine, cacheSize); inferredStreams.put(InferredType.SHORE, shoreBiomeStream); bridgeStream = focus != null ? ProceduralStream.of((x, z) -> focus.getInferredType(), Interpolated.of(a -> 0D, a -> focus.getInferredType())) : engine.getDimension().getContinentalStyle().create(rng.nextParallelRNG(234234565), getData()) .bake().scale(1D / engine.getDimension().getContinentZoom()).bake().stream() .convert((v) -> v >= engine.getDimension().getLandChance() ? InferredType.SEA : InferredType.LAND) - .cache2D(engine, cacheSize); + .cache2D("bridgeStream", engine, cacheSize); baseBiomeStream = focus != null ? ProceduralStream.of((x, z) -> focus, Interpolated.of(a -> 0D, a -> focus)) : bridgeStream.convertAware2D((t, x, z) -> inferredStreams.get(t).get(x, z)) - .convertAware2D(this::implode).cache2D(engine, cacheSize); + .convertAware2D(this::implode).cache2D("baseBiomeStream", engine, cacheSize); heightStream = ProceduralStream.of((x, z) -> { IrisBiome b = focus != null ? focus : baseBiomeStream.get(x, z); return getHeight(engine, b, x, z, engine.getSeedManager().getHeight()); - }, Interpolated.DOUBLE).clamp(0, engine.getHeight()).cache2D(engine, cacheSize); + }, Interpolated.DOUBLE).clamp(0, engine.getHeight()).cache2D("heightStream", engine, cacheSize); roundedHeighteightStream = heightStream.round(); - slopeStream = heightStream.slope(3).cache2D(engine, cacheSize); + slopeStream = heightStream.slope(3).cache2D("slopeStream", engine, cacheSize); trueBiomeStream = focus != null ? ProceduralStream.of((x, y) -> focus, Interpolated.of(a -> 0D, b -> focus)) - .cache2D(engine, cacheSize) : heightStream + .cache2D("trueBiomeStream-focus", engine, cacheSize) : heightStream .convertAware2D((h, x, z) -> fixBiomeType(h, baseBiomeStream.get(x, z), regionStream.get(x, z), x, z, fluidHeight)) - .cache2D(engine, cacheSize); - trueBiomeDerivativeStream = trueBiomeStream.convert(IrisBiome::getDerivative).cache2D(engine, cacheSize); - heightFluidStream = heightStream.max(fluidHeight).cache2D(engine, cacheSize); + .cache2D("trueBiomeStream", engine, cacheSize); + trueBiomeDerivativeStream = trueBiomeStream.convert(IrisBiome::getDerivative).cache2D("trueBiomeDerivativeStream", engine, cacheSize); + heightFluidStream = heightStream.max(fluidHeight).cache2D("heightFluidStream", engine, cacheSize); maxHeightStream = ProceduralStream.ofDouble((x, z) -> height); terrainSurfaceDecoration = trueBiomeStream - .convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.NONE)).cache2D(engine, cacheSize); + .convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.NONE)).cache2D("terrainSurfaceDecoration", engine, cacheSize); terrainCeilingDecoration = trueBiomeStream - .convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.CEILING)).cache2D(engine, cacheSize); + .convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.CEILING)).cache2D("terrainCeilingDecoration", engine, cacheSize); terrainCaveSurfaceDecoration = caveBiomeStream - .convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.NONE)).cache2D(engine, cacheSize); + .convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.NONE)).cache2D("terrainCaveSurfaceDecoration", engine, cacheSize); terrainCaveCeilingDecoration = caveBiomeStream - .convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.CEILING)).cache2D(engine, cacheSize); + .convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.CEILING)).cache2D("terrainCaveCeilingDecoration", engine, cacheSize); shoreSurfaceDecoration = trueBiomeStream - .convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.SHORE_LINE)).cache2D(engine, cacheSize); + .convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.SHORE_LINE)).cache2D("shoreSurfaceDecoration", engine, cacheSize); seaSurfaceDecoration = trueBiomeStream - .convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.SEA_SURFACE)).cache2D(engine, cacheSize); + .convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.SEA_SURFACE)).cache2D("seaSurfaceDecoration", engine, cacheSize); seaFloorDecoration = trueBiomeStream - .convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.SEA_FLOOR)).cache2D(engine, cacheSize); + .convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.SEA_FLOOR)).cache2D("seaFloorDecoration", engine, cacheSize); baseBiomeIDStream = trueBiomeStream.convertAware2D((b, x, z) -> { UUID d = regionIDStream.get(x, z); return new UUID(b.getLoadKey().hashCode() * 818223L, d.hashCode()); }) - .cache2D(engine, cacheSize); + .cache2D("", engine, cacheSize); //@done } diff --git a/src/main/java/com/volmit/iris/engine/framework/MeteredCache.java b/src/main/java/com/volmit/iris/engine/framework/MeteredCache.java index cd9dcc0fa..1f566a861 100644 --- a/src/main/java/com/volmit/iris/engine/framework/MeteredCache.java +++ b/src/main/java/com/volmit/iris/engine/framework/MeteredCache.java @@ -18,10 +18,14 @@ package com.volmit.iris.engine.framework; +import com.volmit.iris.util.data.KCache; + public interface MeteredCache { long getSize(); + KCache getRawCache(); + long getMaxSize(); default double getUsage() diff --git a/src/main/java/com/volmit/iris/util/data/KCache.java b/src/main/java/com/volmit/iris/util/data/KCache.java index cecef8303..effab2c66 100644 --- a/src/main/java/com/volmit/iris/util/data/KCache.java +++ b/src/main/java/com/volmit/iris/util/data/KCache.java @@ -21,19 +21,15 @@ package com.volmit.iris.util.data; import com.github.benmanes.caffeine.cache.CacheLoader; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; -import com.volmit.iris.Iris; import com.volmit.iris.engine.framework.MeteredCache; -import com.volmit.iris.util.format.Form; -import com.volmit.iris.util.scheduling.J; - -import java.util.concurrent.TimeUnit; -import java.util.function.Function; +import com.volmit.iris.util.math.RollingSequence; public class KCache implements MeteredCache { private final long max; private CacheLoader loader; private LoadingCache cache; private final boolean fastDump; + private final RollingSequence msu = new RollingSequence(100); public KCache(CacheLoader loader, long max) { @@ -52,9 +48,8 @@ public class KCache implements MeteredCache { return Caffeine .newBuilder() .maximumSize(max) - .initialCapacity((int) (max)) .softValues() - .expireAfterAccess(5, TimeUnit.MINUTES) + .initialCapacity((int) (max)) .build((k) -> loader == null ? null : loader.load(k)); } @@ -84,6 +79,11 @@ public class KCache implements MeteredCache { return cache.estimatedSize(); } + @Override + public KCache getRawCache() { + return this; + } + @Override public long getMaxSize() { return max; diff --git a/src/main/java/com/volmit/iris/util/stream/ProceduralStream.java b/src/main/java/com/volmit/iris/util/stream/ProceduralStream.java index 082417576..48cf0fe6b 100644 --- a/src/main/java/com/volmit/iris/util/stream/ProceduralStream.java +++ b/src/main/java/com/volmit/iris/util/stream/ProceduralStream.java @@ -289,12 +289,12 @@ public interface ProceduralStream extends ProceduralLayer, Interpolated { return new To3DStream(this); } - default ProceduralStream cache2D(Engine engine, int size) { - return new CachedStream2D(engine, this, size); + default ProceduralStream cache2D(String name, Engine engine, int size) { + return new CachedStream2D(name, engine, this, size); } - default ProceduralStream cache3D(Engine engine, int maxSize) { - return new CachedStream3D(engine, this, maxSize); + default ProceduralStream cache3D(String name, Engine engine, int maxSize) { + return new CachedStream3D(name, engine, this, maxSize); } default ProceduralStream convert(Function converter) { diff --git a/src/main/java/com/volmit/iris/util/stream/utility/CachedStream2D.java b/src/main/java/com/volmit/iris/util/stream/utility/CachedStream2D.java index 16d7b380b..203ecaf52 100644 --- a/src/main/java/com/volmit/iris/util/stream/utility/CachedStream2D.java +++ b/src/main/java/com/volmit/iris/util/stream/utility/CachedStream2D.java @@ -37,7 +37,7 @@ public class CachedStream2D extends BasicStream implements ProceduralStrea private final KCache cache; private final Engine engine; - public CachedStream2D(Engine engine, ProceduralStream stream, int size) { + public CachedStream2D(String name, Engine engine, ProceduralStream stream, int size) { super(); this.stream = stream; this.engine = engine; @@ -70,6 +70,11 @@ public class CachedStream2D extends BasicStream implements ProceduralStrea return cache.getSize(); } + @Override + public KCache getRawCache() { + return cache; + } + @Override public long getMaxSize() { return cache.getMaxSize(); diff --git a/src/main/java/com/volmit/iris/util/stream/utility/CachedStream3D.java b/src/main/java/com/volmit/iris/util/stream/utility/CachedStream3D.java index 97a3c171d..b80b7b66b 100644 --- a/src/main/java/com/volmit/iris/util/stream/utility/CachedStream3D.java +++ b/src/main/java/com/volmit/iris/util/stream/utility/CachedStream3D.java @@ -32,7 +32,7 @@ public class CachedStream3D extends BasicStream implements ProceduralStrea private final KCache cache; private final Engine engine; - public CachedStream3D(Engine engine, ProceduralStream stream, int size) { + public CachedStream3D(String name, Engine engine, ProceduralStream stream, int size) { super(); this.stream = stream; this.engine = engine; @@ -65,6 +65,11 @@ public class CachedStream3D extends BasicStream implements ProceduralStrea return cache.getSize(); } + @Override + public KCache getRawCache() { + return cache; + } + @Override public long getMaxSize() { return cache.getMaxSize();