From 8878e9aa5fe7d7f903ea204a28819be0e1a99e68 Mon Sep 17 00:00:00 2001 From: Brian Neumann-Fopiano Date: Mon, 28 Sep 2026 11:36:50 -0400 Subject: [PATCH] Spread native volume cache keys - Mix chunk keys so origin and query caches stop treeifying buckets --- .../nativegen/NativeStructureVolumeIndex.java | 9 ++++++++ .../NativeStructureVolumeIndexKeyTest.java | 23 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 core/src/test/java/art/arcane/iris/structure/nativegen/NativeStructureVolumeIndexKeyTest.java diff --git a/core/src/main/java/art/arcane/iris/structure/nativegen/NativeStructureVolumeIndex.java b/core/src/main/java/art/arcane/iris/structure/nativegen/NativeStructureVolumeIndex.java index a87750555..6d8458987 100644 --- a/core/src/main/java/art/arcane/iris/structure/nativegen/NativeStructureVolumeIndex.java +++ b/core/src/main/java/art/arcane/iris/structure/nativegen/NativeStructureVolumeIndex.java @@ -8,6 +8,7 @@ import art.arcane.volmlib.nativelib.terrain.structure.NativeStructureVolume; import art.arcane.iris.generation.runtime.IrisEngine; import art.arcane.iris.generation.runtime.Engine; import art.arcane.iris.world.history.GenerationHistoryRuntimeRouter; +import art.arcane.volmlib.util.cache.CacheKey; import art.arcane.volmlib.util.collection.KList; import java.io.IOException; @@ -313,7 +314,15 @@ public final class NativeStructureVolumeIndex { }; } + static int runtimeChunkHash(int runtimeId, long chunkKey) { + return Long.hashCode(CacheKey.mix(chunkKey)) * 31 + runtimeId; + } + private record RuntimeChunkKey(int runtimeId, long chunkKey) { + @Override + public int hashCode() { + return runtimeChunkHash(runtimeId, chunkKey); + } } } diff --git a/core/src/test/java/art/arcane/iris/structure/nativegen/NativeStructureVolumeIndexKeyTest.java b/core/src/test/java/art/arcane/iris/structure/nativegen/NativeStructureVolumeIndexKeyTest.java new file mode 100644 index 000000000..8ad806e17 --- /dev/null +++ b/core/src/test/java/art/arcane/iris/structure/nativegen/NativeStructureVolumeIndexKeyTest.java @@ -0,0 +1,23 @@ +package art.arcane.iris.structure.nativegen; + +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +public class NativeStructureVolumeIndexKeyTest { + @Test + public void neighbouringChunkKeysSpreadAcrossHashBuckets() { + IntOpenHashSet buckets = new IntOpenHashSet(); + int keys = 0; + for (int chunkX = -64; chunkX < 64; chunkX++) { + for (int chunkZ = -64; chunkZ < 64; chunkZ++) { + long chunkKey = ((long) chunkX << 32) ^ (chunkZ & 0xffffffffL); + int hash = NativeStructureVolumeIndex.runtimeChunkHash(7, chunkKey); + buckets.add((hash ^ (hash >>> 16)) & ((1 << 15) - 1)); + keys++; + } + } + assertTrue("buckets=" + buckets.size(), buckets.size() > keys / 2); + } +}