more WIP on cache

This commit is contained in:
Zoe Gidiere
2024-10-11 00:20:46 -06:00
parent 1ae0d1f867
commit 9a01a6c6a0
@@ -11,47 +11,54 @@ public class CacheSampler implements DerivativeNoiseSampler {
private final NoiseSampler sampler; private final NoiseSampler sampler;
private final LoadingCache<DoubleSeededVector2, Double> cache2D; private final LoadingCache<DoubleSeededVector2, Double> cache2D;
private final LoadingCache<DoubleSeededVector3, Double> cache3D; // private final LoadingCache<DoubleSeededVector3, Double> cache3D;
private final LoadingCache<DoubleSeededVector2, double[]> cache2DDirv; // private final LoadingCache<DoubleSeededVector2, double[]> cache2DDirv;
private final LoadingCache<DoubleSeededVector3, double[]> cache3DDirv; // private final LoadingCache<DoubleSeededVector3, double[]> cache3DDirv;
private final ThreadLocal<DoubleSeededVector2> mutable =
ThreadLocal.withInitial(() -> new DoubleSeededVector2(0, 0, 0));
public CacheSampler(NoiseSampler sampler, int dimensions, int generationThreads) { public CacheSampler(NoiseSampler sampler, int dimensions, int generationThreads) {
this.sampler = sampler; this.sampler = sampler;
if (dimensions == 2) { // if (dimensions == 2) {
this.cache2D = Caffeine this.cache2D = Caffeine
.newBuilder() .newBuilder()
.initialCapacity(0) .initialCapacity(0)
.maximumSize(256L * generationThreads) // 1 full chunk (high res) .maximumSize(256L * generationThreads)// 1 full chunk (high res)
.build(vec -> sampler.noise(vec.seed, vec.x, vec.z)); .build(vec -> {
cache3D = null; mutable.remove();
cache3DDirv = null; return sampler.noise(vec.seed, vec.x, vec.z);
if (DerivativeNoiseSampler.isDifferentiable(sampler)) { });
this.cache2DDirv = Caffeine // }
.newBuilder() // cache3D = null;
.initialCapacity(0) // cache3DDirv = null;
.maximumSize(256L * generationThreads) // 1 full chunk (high res) // if (DerivativeNoiseSampler.isDifferentiable(sampler)) {
.build(vec -> ((DerivativeNoiseSampler) sampler).noised(vec.seed, vec.x, vec.z)); // this.cache2DDirv = Caffeine
} else { // .newBuilder()
cache2DDirv = null; // .initialCapacity(0)
} // .maximumSize(256L * generationThreads) // 1 full chunk (high res)
} else { // .build(vec -> ((DerivativeNoiseSampler) sampler).noised(vec.seed, vec.x, vec.z));
this.cache3D = Caffeine // } else {
.newBuilder() // cache2DDirv = null;
.initialCapacity(0) // }
.maximumSize(256L * generationThreads) // 1 full chunk (high res) // } else {
.build(vec -> sampler.noise(vec.seed, vec.x, vec.y, vec.z)); // this.cache3D = Caffeine
cache2D = null; // .newBuilder()
cache2DDirv = null; // .initialCapacity(0)
if (DerivativeNoiseSampler.isDifferentiable(sampler)) { // .maximumSize(256L * generationThreads) // 1 full chunk (high res)
this.cache3DDirv = Caffeine // .build(vec -> sampler.noise(vec.seed, vec.x, vec.y, vec.z));
.newBuilder() // cache2D = null;
.initialCapacity(0) // cache2DDirv = null;
.maximumSize(256L * generationThreads) // 1 full chunk (high res) // if (DerivativeNoiseSampler.isDifferentiable(sampler)) {
.build(vec -> ((DerivativeNoiseSampler) sampler).noised(vec.seed, vec.x, vec.y, vec.z)); // this.cache3DDirv = Caffeine
} else { // .newBuilder()
cache3DDirv = null; // .initialCapacity(0)
} // .maximumSize(256L * generationThreads) // 1 full chunk (high res)
} // .build(vec -> ((DerivativeNoiseSampler) sampler).noised(vec.seed, vec.x, vec.y, vec.z));
// } else {
// cache3DDirv = null;
// }
// }
} }
@Override @Override
@@ -61,30 +68,35 @@ public class CacheSampler implements DerivativeNoiseSampler {
@Override @Override
public double[] noised(long seed, double x, double y) { public double[] noised(long seed, double x, double y) {
return cache2DDirv.get(new DoubleSeededVector2(x, y, seed)); // return cache2DDirv.get(new DoubleSeededVector2(x, y, seed));
return null;
} }
@Override @Override
public double[] noised(long seed, double x, double y, double z) { public double[] noised(long seed, double x, double y, double z) {
return cache3DDirv.get(new DoubleSeededVector3(x, y, z, seed)); // return cache3DDirv.get(new DoubleSeededVector3(x, y, z, seed));
return null;
} }
@Override @Override
public double noise(long seed, double x, double y) { public double noise(long seed, double x, double y) {
DoubleSeededVector2 vec = new DoubleSeededVector2(x, y, seed); // DoubleSeededVector2 vec = new DoubleSeededVector2(x, y, seed);
if (cache2DDirv != null && cache2DDirv.estimatedSize() != 0) { // if (cache2DDirv != null && cache2DDirv.estimatedSize() != 0) {
return cache2DDirv.get(vec)[0]; // return cache2DDirv.get(vec)[0];
} // }
return cache2D.get(vec); DoubleSeededVector2 mutableKey = mutable.get();
mutableKey.set(x, y, seed);
return cache2D.get(mutableKey);
} }
@Override @Override
public double noise(long seed, double x, double y, double z) { public double noise(long seed, double x, double y, double z) {
DoubleSeededVector3 vec = new DoubleSeededVector3(x, y, z, seed); // DoubleSeededVector3 vec = new DoubleSeededVector3(x, y, z, seed);
if (cache3DDirv != null && cache3DDirv.estimatedSize() != 0) { // if (cache3DDirv != null && cache3DDirv.estimatedSize() != 0) {
return cache3DDirv.get(vec)[0]; // return cache3DDirv.get(vec)[0];
} // }
return cache3D.get(vec); // return cache3D.get(vec);
return 0;
} }
private record DoubleSeededVector3(double x, double y, double z, long seed) { private record DoubleSeededVector3(double x, double y, double z, long seed) {
@@ -106,7 +118,24 @@ public class CacheSampler implements DerivativeNoiseSampler {
} }
private record DoubleSeededVector2(double x, double z, long seed) { private class DoubleSeededVector2 {
double x;
double z;
long seed;
public DoubleSeededVector2(double x, double z, long seed) {
this.x = x;
this.z = z;
this.seed = seed;
}
public void set(double x, double z, long seed) {
this.x = x;
this.z = z;
this.seed = seed;
}
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if(obj instanceof DoubleSeededVector2 that) { if(obj instanceof DoubleSeededVector2 that) {