diff --git a/src/main/java/com/dfsek/terra/math/NoiseFunction2.java b/src/main/java/com/dfsek/terra/math/NoiseFunction2.java index ac3ab8d87..7ceeee80a 100644 --- a/src/main/java/com/dfsek/terra/math/NoiseFunction2.java +++ b/src/main/java/com/dfsek/terra/math/NoiseFunction2.java @@ -4,8 +4,9 @@ import com.dfsek.terra.generation.config.NoiseBuilder; import org.polydev.gaea.math.FastNoiseLite; import parsii.eval.Expression; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; public class NoiseFunction2 implements NoiseFunction { private final FastNoiseLite gen; @@ -40,16 +41,20 @@ public class NoiseFunction2 implements NoiseFunction { return true; } - private static class Cache { - private final HashMap map = new HashMap<>(); + private static class Cache extends LinkedHashMap { + private static final long serialVersionUID = 8915092734723467010L; public double get(FastNoiseLite noise, int x, int z) { - long key = (((long) x) << 32) + z; + long key = (long) x << 32 | z & 0xFFFFFFFFL; - return map.computeIfAbsent(key, k -> { - if(map.size() > 512) map.clear(); - return noise.getNoise(x, z); - }); + return computeIfAbsent(key, k -> noise.getNoise(x, z)); + } + + + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + int maxSize = 512; + return size() > maxSize; } } } diff --git a/src/test/java/NoiseTest.java b/src/test/java/NoiseTest.java index 7be68ad2d..4c9dd5beb 100644 --- a/src/test/java/NoiseTest.java +++ b/src/test/java/NoiseTest.java @@ -10,9 +10,10 @@ public class NoiseTest { public void noise() { NoiseFunction2 noiseFunction = new NoiseFunction2(12345, new NoiseBuilder()); System.out.println("Cache:"); - for(int i = 0; i < 10; i++) { + int a = 0; + for(int i = 0; i < 200; i++) { long l = System.nanoTime(); - for(int j = 0; j < 20000; j++) { + for(int j = 0; j < 5000; j++) { for(int x = 0; x < 4; x++) { for(int y = 0; y < 64; y++) { for(int z = 0; z < 4; z++) { @@ -22,12 +23,13 @@ public class NoiseTest { } } double n = System.nanoTime() - l; - System.out.println(n / 1000000 + "ms"); + System.out.print((long) n / 1000000 + "ms" + ((a % 10 == 0) ? "\n" : " ")); + a++; } System.out.println("No Cache:"); - for(int i = 0; i < 10; i++) { + for(int i = 0; i < 200; i++) { long l = System.nanoTime(); - for(int j = 0; j < 20000; j++) { + for(int j = 0; j < 5000; j++) { for(int x = 0; x < 4; x++) { for(int y = 0; y < 64; y++) { for(int z = 0; z < 4; z++) { @@ -37,7 +39,8 @@ public class NoiseTest { } } double n = System.nanoTime() - l; - System.out.println(n / 1000000 + "ms"); + System.out.print((long) n / 1000000 + "ms" + ((a % 10 == 0) ? "\n" : " ")); + a++; } }