Fix cache wackiness

This commit is contained in:
dfsek 2020-11-22 00:27:12 -07:00
parent 3dd08f30a7
commit 21d606853a
2 changed files with 22 additions and 14 deletions

View File

@ -4,8 +4,9 @@ import com.dfsek.terra.generation.config.NoiseBuilder;
import org.polydev.gaea.math.FastNoiseLite; import org.polydev.gaea.math.FastNoiseLite;
import parsii.eval.Expression; import parsii.eval.Expression;
import java.util.HashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map;
public class NoiseFunction2 implements NoiseFunction { public class NoiseFunction2 implements NoiseFunction {
private final FastNoiseLite gen; private final FastNoiseLite gen;
@ -40,16 +41,20 @@ public class NoiseFunction2 implements NoiseFunction {
return true; return true;
} }
private static class Cache { private static class Cache extends LinkedHashMap<Long, Double> {
private final HashMap<Long, Double> map = new HashMap<>(); private static final long serialVersionUID = 8915092734723467010L;
public double get(FastNoiseLite noise, int x, int z) { 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 -> { return computeIfAbsent(key, k -> noise.getNoise(x, z));
if(map.size() > 512) map.clear(); }
return noise.getNoise(x, z);
});
@Override
protected boolean removeEldestEntry(Map.Entry<Long, Double> eldest) {
int maxSize = 512;
return size() > maxSize;
} }
} }
} }

View File

@ -10,9 +10,10 @@ public class NoiseTest {
public void noise() { public void noise() {
NoiseFunction2 noiseFunction = new NoiseFunction2(12345, new NoiseBuilder()); NoiseFunction2 noiseFunction = new NoiseFunction2(12345, new NoiseBuilder());
System.out.println("Cache:"); 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(); 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 x = 0; x < 4; x++) {
for(int y = 0; y < 64; y++) { for(int y = 0; y < 64; y++) {
for(int z = 0; z < 4; z++) { for(int z = 0; z < 4; z++) {
@ -22,12 +23,13 @@ public class NoiseTest {
} }
} }
double n = System.nanoTime() - l; 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:"); System.out.println("No Cache:");
for(int i = 0; i < 10; i++) { for(int i = 0; i < 200; i++) {
long l = System.nanoTime(); 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 x = 0; x < 4; x++) {
for(int y = 0; y < 64; y++) { for(int y = 0; y < 64; y++) {
for(int z = 0; z < 4; z++) { for(int z = 0; z < 4; z++) {
@ -37,7 +39,8 @@ public class NoiseTest {
} }
} }
double n = System.nanoTime() - l; double n = System.nanoTime() - l;
System.out.println(n / 1000000 + "ms"); System.out.print((long) n / 1000000 + "ms" + ((a % 10 == 0) ? "\n" : " "));
a++;
} }
} }