From 33a39cb237a756432a5cf1dacfa7c990d4dffb1b Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 10 Jun 2022 15:23:06 -0700 Subject: [PATCH] optimize biome pipeline cache for 3 dimensions --- .../biome-provider-pipeline/build.gradle.kts | 2 +- .../biome/pipeline/BiomePipelineColumn.java | 71 +++++++++++++++++++ .../biome/pipeline/BiomePipelineProvider.java | 8 +++ .../java/com/dfsek/terra/api/util/Column.java | 3 + .../world/biome/generation/BiomeColumn.java | 10 +++ .../generation/CachingBiomeProvider.java | 3 +- common/api/src/test/java/util/ColumnTest.java | 12 +++- 7 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineColumn.java diff --git a/common/addons/biome-provider-pipeline/build.gradle.kts b/common/addons/biome-provider-pipeline/build.gradle.kts index 9342c3cad..ec1104ce3 100644 --- a/common/addons/biome-provider-pipeline/build.gradle.kts +++ b/common/addons/biome-provider-pipeline/build.gradle.kts @@ -1,4 +1,4 @@ -version = version("1.0.0") +version = version("1.0.1") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineColumn.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineColumn.java new file mode 100644 index 000000000..2f9d5f15e --- /dev/null +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineColumn.java @@ -0,0 +1,71 @@ +package com.dfsek.terra.addons.biome.pipeline; + +import com.dfsek.terra.api.util.Column; +import com.dfsek.terra.api.util.function.IntIntObjConsumer; +import com.dfsek.terra.api.util.function.IntObjConsumer; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; + +import java.util.function.Consumer; + + +class BiomePipelineColumn implements Column { + private final int min; + private final int max; + + private final int x; + private final int z; + private final Biome biome; + + protected BiomePipelineColumn(BiomeProvider biomeProvider, int min, int max, int x, int z, long seed) { + this.min = min; + this.max = max; + this.x = x; + this.z = z; + this.biome = biomeProvider.getBiome(x, 0, z, seed); + } + + @Override + public int getMinY() { + return min; + } + + @Override + public int getMaxY() { + return max; + } + + @Override + public int getX() { + return x; + } + + @Override + public int getZ() { + return z; + } + + @Override + public Biome get(int y) { + return biome; + } + + @Override + public void forRanges(IntIntObjConsumer consumer) { + consumer.accept(min, max, biome); + } + + @Override + public void forEach(Consumer consumer) { + for(int y = min; y < max; y++) { + consumer.accept(biome); + } + } + + @Override + public void forEach(IntObjConsumer consumer) { + for(int y = min; y < max; y++) { + consumer.accept(y, biome); + } + } +} diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java index bef494a0f..0fece9698 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java @@ -7,6 +7,9 @@ package com.dfsek.terra.addons.biome.pipeline; +import com.dfsek.terra.api.util.Column; +import com.dfsek.terra.api.world.info.WorldProperties; + import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; import net.jafama.FastMath; @@ -92,6 +95,11 @@ public class BiomePipelineProvider implements BiomeProvider { return biomes; } + @Override + public Column getColumn(int x, int z, WorldProperties properties) { + return new BiomePipelineColumn(this, properties.getMinHeight(), properties.getMaxHeight(), x, z, properties.getSeed()); + } + private record SeededVector(int x, int z, long seed) { } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/Column.java b/common/api/src/main/java/com/dfsek/terra/api/util/Column.java index 08e696156..cbabcaaa1 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/Column.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/Column.java @@ -17,6 +17,9 @@ public interface Column { int getMaxY(); + int getX(); + int getZ(); + T get(int y); default void forEach(Consumer consumer) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeColumn.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeColumn.java index 22b19767b..addec2110 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeColumn.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeColumn.java @@ -32,6 +32,16 @@ class BiomeColumn implements Column { return max; } + @Override + public int getX() { + return x; + } + + @Override + public int getZ() { + return z; + } + @Override public Biome get(int y) { return biomeProvider.getBiome(x, y, z, seed); diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java index 49846b11a..7e29a180c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java @@ -21,7 +21,6 @@ public class CachingBiomeProvider implements BiomeProvider, Handle { private final int minY; private final int maxY; private final Map cache = new HashMap<>(); - private final Map> columns = new HashMap<>(); protected CachingBiomeProvider(BiomeProvider delegate, int minY, int maxY) { this.delegate = delegate; @@ -47,7 +46,7 @@ public class CachingBiomeProvider implements BiomeProvider, Handle { @Override public Column getColumn(int x, int z, WorldProperties properties) { - return columns.computeIfAbsent(MathUtil.squash(x, z), k -> BiomeProvider.super.getColumn(x, z, properties)); + return delegate.getColumn(x, z, properties); } @Override diff --git a/common/api/src/test/java/util/ColumnTest.java b/common/api/src/test/java/util/ColumnTest.java index b621a1465..df6f2d53c 100644 --- a/common/api/src/test/java/util/ColumnTest.java +++ b/common/api/src/test/java/util/ColumnTest.java @@ -87,7 +87,17 @@ public class ColumnTest { public int getMaxY() { return max; } - + + @Override + public int getX() { + return 0; + } + + @Override + public int getZ() { + return 0; + } + @Override public T get(int y) { return p.apply(y);