From 393ea10cdfee323c14a447d07c0fad91090117c4 Mon Sep 17 00:00:00 2001 From: Brian Neumann-Fopiano Date: Wed, 21 Oct 2026 21:58:31 -0400 Subject: [PATCH] Pregen hydrology reach - Pregen tile speculation limited to the generation reach around the area instead of a 512-block halo --- .../hydrology/HydrologyTileCache.java | 2 +- .../hydrology/HydrologyTileCacheTest.java | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/art/arcane/iris/generation/hydrology/HydrologyTileCache.java b/core/src/main/java/art/arcane/iris/generation/hydrology/HydrologyTileCache.java index bc8178418..b4ff8db4f 100644 --- a/core/src/main/java/art/arcane/iris/generation/hydrology/HydrologyTileCache.java +++ b/core/src/main/java/art/arcane/iris/generation/hydrology/HydrologyTileCache.java @@ -43,7 +43,7 @@ public final class HydrologyTileCache implements AutoCloseable { private static final byte AROUND_EMPTY = 1; private static final byte AROUND_PUBLISHED = 2; private static final int MAXIMUM_PREGENERATION_TILES = 4096; - private static final int PREGENERATION_HALO_BLOCKS = 512; + private static final int PREGENERATION_HALO_BLOCKS = 256; private static final HydrologyColumnSample[] NO_COLUMNS = new HydrologyColumnSample[CHUNK_COLUMN_COUNT]; private static final Cache SHARED_TILES = Caffeine.newBuilder() .maximumWeight(HydrologyCacheBudget.sharedStudioBytes()) diff --git a/core/src/test/java/art/arcane/iris/generation/hydrology/HydrologyTileCacheTest.java b/core/src/test/java/art/arcane/iris/generation/hydrology/HydrologyTileCacheTest.java index f9b670632..817a6c7e7 100644 --- a/core/src/test/java/art/arcane/iris/generation/hydrology/HydrologyTileCacheTest.java +++ b/core/src/test/java/art/arcane/iris/generation/hydrology/HydrologyTileCacheTest.java @@ -696,6 +696,29 @@ public class HydrologyTileCacheTest { cache.close(); } + @Test + public void pregenSpeculationStaysWithinTheGenerationReachOfTheArea() { + HydrologyPlanner planner = mock(HydrologyPlanner.class); + HydrologyTile tile = mock(HydrologyTile.class); + HydrologyPlannerSettings settings = stalePrefetchSettings(); + when(planner.settings()).thenReturn(settings); + ArrayList planned = new ArrayList<>(); + doAnswer(invocation -> { + planned.add(invocation.getArgument(0)); + return tile; + }).when(planner).plan(any(HydrologyTileKey.class)); + HydrologyTileCache cache = new HydrologyTileCache(planner, 128, Runnable::run); + try (HydrologyTileCache.PregenerationScope ignored = cache.preparePregeneration( + new HydrologyTileCache.PregenerationArea(1024, 1024, 736, 736, 1311, 1311))) { + assertEquals(prefetchRectangle(0, 1, 0, 1), new HashSet<>(planned)); + cache.prepareChunkColumns(800, 800); + cache.prepareChunkColumns(1300, 1300); + assertEquals(prefetchRectangle(0, 1, 0, 1), new HashSet<>(planned)); + assertEquals(4, planned.size()); + } + cache.close(); + } + @Test public void pregenScopesRestoreStudioPrefetchAndIgnoreSupersededClose() { HydrologyPlanner planner = mock(HydrologyPlanner.class);