From 6ebb700be04e6c4b6548dacb7889df46ffebcb6c Mon Sep 17 00:00:00 2001 From: Brian Neumann-Fopiano Date: Wed, 21 Oct 2026 19:29:37 -0400 Subject: [PATCH] Reuse cave biome cache - Carve scratch keeps one cave biome cache per thread, cleared per chunk --- .../art/arcane/iris/generation/stage/IrisCarveModifier.java | 2 +- .../art/arcane/iris/generation/stage/IrisCarveScratch.java | 3 +++ .../art/arcane/iris/generation/stage/IrisCarveScratchTest.java | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/art/arcane/iris/generation/stage/IrisCarveModifier.java b/core/src/main/java/art/arcane/iris/generation/stage/IrisCarveModifier.java index ced2742a0..4a09bc530 100644 --- a/core/src/main/java/art/arcane/iris/generation/stage/IrisCarveModifier.java +++ b/core/src/main/java/art/arcane/iris/generation/stage/IrisCarveModifier.java @@ -102,9 +102,9 @@ public class IrisCarveModifier extends EngineAssignedModifier PrecisionStopwatch caveStopwatch = PrecisionStopwatch.start(); Mantle mantle = getEngine().getMantle().getMantle(); CaveInputs resolverState = new CaveInputs(getEngine()); - Long2ObjectOpenHashMap caveBiomeCache = new Long2ObjectOpenHashMap<>(2048); IrisCarveScratch scratch = SCRATCH.get(); scratch.reset(); + Long2ObjectOpenHashMap caveBiomeCache = scratch.caveBiomeCache; CarveWallBuffer walls = scratch.walls; CarveColumnMask[] columnMasks = scratch.columnMasks; CarveColumnMask[] boundaryMasks = scratch.boundaryMasks; diff --git a/core/src/main/java/art/arcane/iris/generation/stage/IrisCarveScratch.java b/core/src/main/java/art/arcane/iris/generation/stage/IrisCarveScratch.java index e75522d11..6dfd76d6f 100644 --- a/core/src/main/java/art/arcane/iris/generation/stage/IrisCarveScratch.java +++ b/core/src/main/java/art/arcane/iris/generation/stage/IrisCarveScratch.java @@ -21,6 +21,7 @@ package art.arcane.iris.generation.stage; import art.arcane.iris.generation.biome.IrisBiome; import art.arcane.volmlib.util.matter.MatterCavern; import art.arcane.volmlib.util.math.PowerOfTwoCoordinates; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import java.util.Arrays; import java.util.HashMap; @@ -32,6 +33,7 @@ final class IrisCarveScratch { final int[] surfaceHeights = new int[256]; final CarveWallBuffer walls = new CarveWallBuffer(512); final Map customBiomeCache = new HashMap<>(); + final Long2ObjectOpenHashMap caveBiomeCache = new Long2ObjectOpenHashMap<>(4096); int[] upperSurfaceHeights; boolean customCaveBiomePresent; @@ -56,6 +58,7 @@ final class IrisCarveScratch { } walls.clear(); customBiomeCache.clear(); + caveBiomeCache.clear(); customCaveBiomePresent = false; } } diff --git a/core/src/test/java/art/arcane/iris/generation/stage/IrisCarveScratchTest.java b/core/src/test/java/art/arcane/iris/generation/stage/IrisCarveScratchTest.java index b979d3f63..bfe93fb0c 100644 --- a/core/src/test/java/art/arcane/iris/generation/stage/IrisCarveScratchTest.java +++ b/core/src/test/java/art/arcane/iris/generation/stage/IrisCarveScratchTest.java @@ -1,5 +1,6 @@ package art.arcane.iris.generation.stage; +import art.arcane.iris.generation.biome.IrisBiome; import art.arcane.volmlib.util.matter.MatterCavern; import org.junit.Test; @@ -49,6 +50,7 @@ public class IrisCarveScratchTest { scratch.boundaryMasks[0].add(13); scratch.walls.put(1, 12, 2, cavern); scratch.customBiomeCache.put("cave", null); + scratch.caveBiomeCache.put(42L, new IrisBiome()); scratch.customCaveBiomePresent = true; scratch.reset(); @@ -56,6 +58,7 @@ public class IrisCarveScratchTest { assertTrue(scratch.columnMasks[0].isEmpty()); assertTrue(scratch.boundaryMasks[0].isEmpty()); assertTrue(scratch.customBiomeCache.isEmpty()); + assertTrue(scratch.caveBiomeCache.isEmpty()); assertFalse(scratch.customCaveBiomePresent); int[] wallCount = new int[1]; scratch.walls.forEach((x, y, z, value) -> wallCount[0]++);