From bba55f2669e242ddb3614f40e9ff103f2278fda9 Mon Sep 17 00:00:00 2001 From: Zoe Gidiere Date: Thu, 11 Dec 2025 01:56:20 -0700 Subject: [PATCH] Align TriStateIntCache --- .../extrusion/extrusions/ReplaceExtrusion.java | 5 +---- .../api/util/collection/TriStateIntCache.java | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/ReplaceExtrusion.java b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/ReplaceExtrusion.java index cd7eb034f..4985a2f90 100644 --- a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/ReplaceExtrusion.java +++ b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/extrusions/ReplaceExtrusion.java @@ -23,9 +23,6 @@ public class ReplaceExtrusion implements Extrusion { private final Range range; private final ProbabilityCollection biomes; private final Predicate hasTag; - - // Replaced ThreadLocal with a specialized primitive cache. - // Shared across all threads safely. private final TriStateIntCache cache; public ReplaceExtrusion(Sampler sampler, Range range, ProbabilityCollection biomes, String tag) { @@ -33,7 +30,7 @@ public class ReplaceExtrusion implements Extrusion { this.range = range; this.biomes = biomes; this.hasTag = BiomeQueries.has(tag); - this.cache = new TriStateIntCache(Math.max(512, Biome.INT_ID_COUNTER.get())); + this.cache = new TriStateIntCache(Biome.INT_ID_COUNTER.get()); } @Override diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/collection/TriStateIntCache.java b/common/api/src/main/java/com/dfsek/terra/api/util/collection/TriStateIntCache.java index 1dd005fcc..c50f80d8c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/collection/TriStateIntCache.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/collection/TriStateIntCache.java @@ -24,8 +24,22 @@ public class TriStateIntCache { ARRAY_BASE_OFFSET = UnsafeUtils.UNSAFE.arrayBaseOffset(long[].class); } + private static int getOptimalMaxKeys(int requestedKeys) { + // 192 keys fill the first cache line exactly (along with the 16-byte header) + if (requestedKeys <= 192) { + return 192; + } + + // For every additional line, we fit 256 keys (64 bytes * 4 keys/byte) + // We calculate the overflow beyond 192, round up to the nearest 256, and add it back. + int overflow = requestedKeys - 192; + int chunks = (overflow + 255) >>> 8; // Fast ceil division by 256 + + return 192 + (chunks << 8); // chunks * 256 + } + public TriStateIntCache(int maxKeySize) { - this.data = new long[(maxKeySize + 31) >>> 5]; + this.data = new long[(getOptimalMaxKeys(maxKeySize) + 31) >>> 5]; } /**