From 7c7309c3ab0e07d0849afc597410afa63102b5b9 Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Sun, 11 Sep 2022 20:58:58 -0400 Subject: [PATCH] Unload mantle when not generating --- .../java/com/volmit/iris/engine/IrisComplex.java | 3 ++- .../java/com/volmit/iris/engine/IrisEngine.java | 3 +-- .../com/volmit/iris/util/context/ChunkContext.java | 2 ++ .../volmit/iris/util/context/ChunkedDataCache.java | 13 ++++++++++++- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/IrisComplex.java b/src/main/java/com/volmit/iris/engine/IrisComplex.java index f39ad50a1..fa7576e23 100644 --- a/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -175,7 +175,8 @@ public class IrisComplex implements DataProvider { heightStream = ProceduralStream.of((x, z) -> { IrisBiome b = focusBiome != null ? focusBiome : baseBiomeStream.get(x, z); return getHeight(engine, b, x, z, engine.getSeedManager().getHeight()); - }, Interpolated.DOUBLE).clamp(0, engine.getHeight()).cache2D("heightStream", engine, cacheSize).waste("Height Stream") + }, Interpolated.DOUBLE).clamp(0, engine.getHeight()).cache2D("heightStream", engine, cacheSize) + .waste("Height Stream") .contextInjecting((c,x,z)->c.getHeight().get(x, z)); roundedHeighteightStream = heightStream.round().waste("Rounded Height Stream") .contextInjecting((c,x,z)->(int)Math.round(c.getHeight().get(x, z))); diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index 7849ef760..c373df9a5 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -147,6 +147,7 @@ public class IrisEngine implements Engine { } private void tickRandomPlayer() { + recycle(); if(perSecondBudLatch.flip()) { buds.set(bud.get()); bud.set(0); @@ -459,8 +460,6 @@ public class IrisEngine implements Engine { if(generated.get() == 661) { J.a(() -> getData().savePrefetch(this)); } - - recycle(); } catch(Throwable e) { Iris.reportError(e); fail("Failed to generate " + x + ", " + z, e); diff --git a/src/main/java/com/volmit/iris/util/context/ChunkContext.java b/src/main/java/com/volmit/iris/util/context/ChunkContext.java index 8abd0dfb4..9986d8983 100644 --- a/src/main/java/com/volmit/iris/util/context/ChunkContext.java +++ b/src/main/java/com/volmit/iris/util/context/ChunkContext.java @@ -3,6 +3,7 @@ package com.volmit.iris.util.context; import com.volmit.iris.engine.IrisComplex; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisRegion; +import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.parallel.MultiBurst; @@ -28,6 +29,7 @@ public class ChunkContext { public ChunkContext(int x, int z, IrisComplex c, boolean cache) { this.x = x; this.z = z; + if(cache) { BurstExecutor b = MultiBurst.burst.burst(); height = new ChunkedDataCache<>(b, c.getHeightStream(), x, z); diff --git a/src/main/java/com/volmit/iris/util/context/ChunkedDataCache.java b/src/main/java/com/volmit/iris/util/context/ChunkedDataCache.java index b9a18ccfb..c8a58b481 100644 --- a/src/main/java/com/volmit/iris/util/context/ChunkedDataCache.java +++ b/src/main/java/com/volmit/iris/util/context/ChunkedDataCache.java @@ -1,12 +1,18 @@ package com.volmit.iris.util.context; +import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.stream.ProceduralStream; +import lombok.Data; +import java.util.HashSet; + +@Data public class ChunkedDataCache { private final int x; private final int z; + private final KSet uniques; private final Object[] data; private final boolean cache; private final ProceduralStream stream; @@ -21,6 +27,7 @@ public class ChunkedDataCache { this.cache = cache; this.x = x; this.z = z; + this.uniques = cache ? new KSet<>() : null; if(cache) { data = new Object[256]; int i,j; @@ -29,7 +36,11 @@ public class ChunkedDataCache { int finalI = i; for(j = 0; j < 16; j++) { int finalJ = j; - burst.queue(() -> data[(finalJ * 16) + finalI] = stream.get(x+ finalI, z+ finalJ)); + burst.queue(() -> { + T t = stream.get(x+ finalI, z+ finalJ); + data[(finalJ * 16) + finalI] = t; + uniques.add(t); + }); } } }