From d1c018690d4c70efb25544b3c6933e2b5a9e6974 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 13 Jan 2021 14:03:52 -0700 Subject: [PATCH] minor perf improvements --- .../math/noise/samplers/FastNoiseLite.java | 27 +++++++------- .../terra/biome/StandardBiomeProvider.java | 2 +- .../terra/biome/pipeline/BiomePipeline.java | 2 +- .../biome/pipeline/TerraBiomeHolder.java | 12 ++----- .../biome/pipeline/mutator/BiomeMutator.java | 12 +++++-- .../dfsek/terra/config/base/ConfigPack.java | 2 ++ common/src/test/java/biome/BiomeTest.java | 35 +++++++------------ 7 files changed, 40 insertions(+), 52 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java index e6b1dd67b..5ffa366d9 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java +++ b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java @@ -1616,30 +1616,29 @@ public class FastNoiseLite implements NoiseSampler { return lerp(xf0, xf1, ys) * 1.4247691104677813f; } - private static long hash(long in) { - in = (in + 0x7ed55d16) + (in << 12); - in = (in ^ 0xc761c23c) ^ (in >> 19); - in = (in + 0x165667b1) + (in << 5); - in = (in + 0xd3a2646c) ^ (in << 9); - in = (in + 0xfd7046c5) + (in << 3); - in = (in ^ 0xb55a4f09) ^ (in >> 16); - return in; + long murmur64(long h) { + h ^= h >>> 33; + h *= 0xff51afd7ed558ccdL; + h ^= h >>> 33; + h *= 0xc4ceb9fe1a85ec53L; + h ^= h >>> 33; + return h; } private double singleWhiteNoise(int seed, double x, double y, double z) { - long hashX = hash(Double.doubleToRawLongBits(x) ^ seed); - long hashZ = hash(Double.doubleToRawLongBits(y) ^ seed); + long hashX = murmur64(Double.doubleToRawLongBits(x) ^ seed); + long hashZ = murmur64(Double.doubleToRawLongBits(y) ^ seed); long hash = (((hashX ^ (hashX >>> 32)) + ((hashZ ^ (hashZ >>> 32)) << 32)) ^ seed) + Double.doubleToRawLongBits(z); - long base = ((hash(hash)) & 0x000fffffffffffffL) + long base = ((murmur64(hash)) & 0x000fffffffffffffL) + POSITIVE_POW1; // Sign and exponent return (Double.longBitsToDouble(base) - 1.5) * 2; } private double singleWhiteNoise(int seed, double x, double y) { - long hashX = hash(Double.doubleToRawLongBits(x) ^ seed); - long hashZ = hash(Double.doubleToRawLongBits(y) ^ seed); + long hashX = murmur64(Double.doubleToRawLongBits(x) ^ seed); + long hashZ = murmur64(Double.doubleToRawLongBits(y) ^ seed); long hash = ((hashX ^ (hashX >>> 32)) + ((hashZ ^ (hashZ >>> 32)) << 32)) ^ seed; - long base = (hash(hash) & 0x000fffffffffffffL) + long base = (murmur64(hash) & 0x000fffffffffffffL) + POSITIVE_POW1; // Sign and exponent return (Double.longBitsToDouble(base) - 1.5) * 2; } diff --git a/common/src/main/java/com/dfsek/terra/biome/StandardBiomeProvider.java b/common/src/main/java/com/dfsek/terra/biome/StandardBiomeProvider.java index b53bb80ed..872d7e854 100644 --- a/common/src/main/java/com/dfsek/terra/biome/StandardBiomeProvider.java +++ b/common/src/main/java/com/dfsek/terra/biome/StandardBiomeProvider.java @@ -41,7 +41,7 @@ public class StandardBiomeProvider implements BiomeProvider { } } ); - private int resolution = 4; + private int resolution = 1; protected StandardBiomeProvider(BiomePipeline pipeline) { this.pipeline = pipeline; diff --git a/common/src/main/java/com/dfsek/terra/biome/pipeline/BiomePipeline.java b/common/src/main/java/com/dfsek/terra/biome/pipeline/BiomePipeline.java index fcc4e2b10..fa16ddced 100644 --- a/common/src/main/java/com/dfsek/terra/biome/pipeline/BiomePipeline.java +++ b/common/src/main/java/com/dfsek/terra/biome/pipeline/BiomePipeline.java @@ -21,7 +21,7 @@ public class BiomePipeline { } public BiomeHolder getBiomes(int x, int z) { - BiomeHolder holder = new TerraBiomeHolder(25, new Vector2(x * (init - 1), z * (init - 1))); + BiomeHolder holder = new TerraBiomeHolder(init, new Vector2(x * (init - 1), z * (init - 1))); holder.fill(source); for(Stage stage : stages) holder = stage.apply(holder); return holder; diff --git a/common/src/main/java/com/dfsek/terra/biome/pipeline/TerraBiomeHolder.java b/common/src/main/java/com/dfsek/terra/biome/pipeline/TerraBiomeHolder.java index f49957b1c..ff7ed30cf 100644 --- a/common/src/main/java/com/dfsek/terra/biome/pipeline/TerraBiomeHolder.java +++ b/common/src/main/java/com/dfsek/terra/biome/pipeline/TerraBiomeHolder.java @@ -12,6 +12,7 @@ public class TerraBiomeHolder implements BiomeHolder { private TerraBiome[][] biomes; public TerraBiomeHolder(int width, Vector2 origin) { + if(width % 2 == 0) throw new IllegalArgumentException(); this.width = width; biomes = new TerraBiome[width][width]; this.origin = origin; @@ -48,11 +49,7 @@ public class TerraBiomeHolder implements BiomeHolder { public void mutate(BiomeMutator mutator) { for(int x = 0; x < width; x++) { for(int z = 0; z < width; z++) { - BiomeMutator.ViewPoint viewPoint = new BiomeMutator.ViewPoint(new TerraBiome[][] { - {getBiomeRaw(x - 1, z + 1), getBiomeRaw(x, z + 1), getBiomeRaw(x + 1, z + 1)}, - {getBiomeRaw(x - 1, z), getBiomeRaw(x, z), getBiomeRaw(x + 1, z)}, - {getBiomeRaw(x - 1, z - 1), getBiomeRaw(x, z - 1), getBiomeRaw(x + 1, z - 1)} - }); + BiomeMutator.ViewPoint viewPoint = new BiomeMutator.ViewPoint(this, x, z); biomes[x][z] = mutator.mutate(viewPoint, x + origin.getX(), z + origin.getZ()); } } @@ -67,11 +64,6 @@ public class TerraBiomeHolder implements BiomeHolder { } } - private TerraBiome getBiomeRaw(int x, int z) { - if(x >= width || z >= width || x < 0 || z < 0) return null; - return biomes[x][z]; - } - @Override public TerraBiome getBiome(int x, int z) { if(x >= width || z >= width || x < 0 || z < 0) return null; diff --git a/common/src/main/java/com/dfsek/terra/biome/pipeline/mutator/BiomeMutator.java b/common/src/main/java/com/dfsek/terra/biome/pipeline/mutator/BiomeMutator.java index 16150a558..deb10d379 100644 --- a/common/src/main/java/com/dfsek/terra/biome/pipeline/mutator/BiomeMutator.java +++ b/common/src/main/java/com/dfsek/terra/biome/pipeline/mutator/BiomeMutator.java @@ -1,19 +1,25 @@ package com.dfsek.terra.biome.pipeline.mutator; import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.biome.pipeline.BiomeHolder; public interface BiomeMutator { TerraBiome mutate(ViewPoint viewPoint, double x, double z); class ViewPoint { - private final TerraBiome[][] biomes; + private final BiomeHolder biomes; + private final int offX; + private final int offZ; - public ViewPoint(TerraBiome[][] biomes) { + public ViewPoint(BiomeHolder biomes, int offX, int offZ) { this.biomes = biomes; + this.offX = offX; + this.offZ = offZ; } + public TerraBiome getBiome(int x, int z) { - return biomes[x + 1][z + 1]; + return biomes.getBiome(x + offX, z + offZ); } } } diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index f263b3fe3..81d21bcef 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -146,6 +146,8 @@ public class ConfigPack implements LoaderRegistrar { selfLoader.load(template, stream); load(new ZIPLoader(file), l, main); + + template.getProviderBuilder().build(0); // Build dummy provider to catch errors at load time. } private void load(Loader loader, long start, TerraPlugin main) throws ConfigException { diff --git a/common/src/test/java/biome/BiomeTest.java b/common/src/test/java/biome/BiomeTest.java index 66a7f6f3d..dea3a70dc 100644 --- a/common/src/test/java/biome/BiomeTest.java +++ b/common/src/test/java/biome/BiomeTest.java @@ -6,7 +6,8 @@ import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.biome.pipeline.BiomeHolder; +import com.dfsek.terra.biome.BiomeProvider; +import com.dfsek.terra.biome.StandardBiomeProvider; import com.dfsek.terra.biome.pipeline.BiomePipeline; import com.dfsek.terra.biome.pipeline.expand.FractalExpander; import com.dfsek.terra.biome.pipeline.mutator.BorderMutator; @@ -60,9 +61,8 @@ public class BiomeTest { BiomeSource source = new RandomSource(climate, sourceSampler); - long s = System.nanoTime(); - BiomePipeline pipeline = new BiomePipeline.BiomePipelineBuilder(20) + BiomeProvider provider = new StandardBiomeProvider.StandardBiomeProviderBuilder((seed) -> new BiomePipeline.BiomePipelineBuilder(3) .addStage(new ExpanderStage(new FractalExpander(whiteNoise(1)))) .addStage(new MutatorStage(new ReplaceMutator("OCEAN_TEMP", oceanBiomes, whiteNoise(243)))) .addStage(new MutatorStage(new ReplaceMutator("LAND_TEMP", landBiomes, whiteNoise(243)))) @@ -73,21 +73,10 @@ public class BiomeTest { .addStage(new MutatorStage(new BorderMutator(Sets.newHashSet("OCEAN"), "LAND", whiteNoise(1234), beachBiomes))) .addStage(new ExpanderStage(new FractalExpander(whiteNoise(5)))) .addStage(new MutatorStage(new SmoothMutator(whiteNoise(6)))) - .build(source); + .build(source)).build(0); - BiomeHolder holder = pipeline.getBiomes(0, 0); - BiomeHolder holder2 = pipeline.getBiomes(1, 0); - BiomeHolder holder3 = pipeline.getBiomes(0, 1); - BiomeHolder holder4 = pipeline.getBiomes(1, 1); - long e = System.nanoTime(); - - int size = pipeline.getSize(); - int og = size; - size *= 2; - double time = e - s; - time /= 1000000; - System.out.println(time + "ms for " + size + "x" + size); + int size = 1000; BufferedImage image = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB); @@ -95,17 +84,17 @@ public class BiomeTest { System.out.println(size); + long s = System.nanoTime(); for(int x = 0; x < size; x++) { for(int z = 0; z < size; z++) { - if(x < og) { - if(z < og) image.setRGB(x, z, holder.getBiome(x, z).getColor()); - else image.setRGB(x, z, holder3.getBiome(x, z - og).getColor()); - } else { - if(z < og) image.setRGB(x, z, holder2.getBiome(x - og, z).getColor()); - else image.setRGB(x, z, holder4.getBiome(x - og, z - og).getColor()); - } + image.setRGB(x, z, provider.getBiome(x, z).getColor()); } } + long e = System.nanoTime(); + + double time = e - s; + time /= 1000000; + System.out.println(time + "ms for " + size + "x" + size); JFrame frame = new JFrame("TerraBiome Viewer");