summaryrefslogtreecommitdiffhomepage
path: root/patches/unapplied/server/0507-Significantly-improve-performance-of-the-end-generat.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/unapplied/server/0507-Significantly-improve-performance-of-the-end-generat.patch')
-rw-r--r--patches/unapplied/server/0507-Significantly-improve-performance-of-the-end-generat.patch63
1 files changed, 63 insertions, 0 deletions
diff --git a/patches/unapplied/server/0507-Significantly-improve-performance-of-the-end-generat.patch b/patches/unapplied/server/0507-Significantly-improve-performance-of-the-end-generat.patch
new file mode 100644
index 0000000000..95f0914262
--- /dev/null
+++ b/patches/unapplied/server/0507-Significantly-improve-performance-of-the-end-generat.patch
@@ -0,0 +1,63 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: SuperCoder7979 <[email protected]>
+Date: Tue, 3 Nov 2020 23:48:05 -0600
+Subject: [PATCH] Significantly improve performance of the end generation
+
+This patch implements a noise cache for the end which significantly reduces the computation time of generation. This results in about a 3x improvement.
+
+Original code by SuperCoder7979 and Gegy in Lithium, licensed under LGPL-3.0 (Source: https://github.com/jellysquid3/lithium-fabric)
+
+Co-authored-by: Gegy <[email protected]>
+Co-authored-by: Dylan Xaldin <[email protected]>
+Co-authored-by: pop4959 <[email protected]>
+
+diff --git a/src/main/java/net/minecraft/world/level/levelgen/DensityFunctions.java b/src/main/java/net/minecraft/world/level/levelgen/DensityFunctions.java
+index fac92f37c32e0398ebc05d9a0378446fcabaef1a..1beacd84bb0eee1f3e8f451fc1c514e23cc62826 100644
+--- a/src/main/java/net/minecraft/world/level/levelgen/DensityFunctions.java
++++ b/src/main/java/net/minecraft/world/level/levelgen/DensityFunctions.java
+@@ -490,6 +490,16 @@ public final class DensityFunctions {
+ public static final KeyDispatchDataCodec<DensityFunctions.EndIslandDensityFunction> CODEC = KeyDispatchDataCodec.of(MapCodec.unit(new DensityFunctions.EndIslandDensityFunction(0L)));
+ private static final float ISLAND_THRESHOLD = -0.9F;
+ private final SimplexNoise islandNoise;
++ // Paper start
++ private static final class NoiseCache {
++ public long[] keys = new long[8192];
++ public float[] values = new float[8192];
++ public NoiseCache() {
++ java.util.Arrays.fill(keys, Long.MIN_VALUE);
++ }
++ }
++ private static final ThreadLocal<java.util.Map<SimplexNoise, NoiseCache>> noiseCache = ThreadLocal.withInitial(java.util.WeakHashMap::new);
++ // Paper end
+
+ public EndIslandDensityFunction(long seed) {
+ RandomSource randomSource = new LegacyRandomSource(seed);
+@@ -505,12 +515,26 @@ public final class DensityFunctions {
+ float f = 100.0F - Mth.sqrt((long) x * (long) x + (long) z * (long) z) * 8.0F; // Paper - cast ints to long to avoid integer overflow
+ f = Mth.clamp(f, -100.0F, 80.0F);
+
++ NoiseCache cache = noiseCache.get().computeIfAbsent(sampler, noiseKey -> new NoiseCache()); // Paper
+ for(int m = -12; m <= 12; ++m) {
+ for(int n = -12; n <= 12; ++n) {
+ long o = (long)(i + m);
+ long p = (long)(j + n);
+- if (o * o + p * p > 4096L && sampler.getValue((double)o, (double)p) < (double)-0.9F) {
+- float g = (Mth.abs((float)o) * 3439.0F + Mth.abs((float)p) * 147.0F) % 13.0F + 9.0F;
++ // Paper start - Significantly improve end generation performance by using a noise cache
++ long key = net.minecraft.world.level.ChunkPos.asLong((int) o, (int) p);
++ int index = (int) it.unimi.dsi.fastutil.HashCommon.mix(key) & 8191;
++ float g = Float.MIN_VALUE;
++ if (cache.keys[index] == key) {
++ g = cache.values[index];
++ } else {
++ if (o * o + p * p > 4096L && sampler.getValue((double)o, (double)p) < (double)-0.9F) {
++ g = (Mth.abs((float) o) * 3439.0F + Mth.abs((float) p) * 147.0F) % 13.0F + 9.0F;
++ }
++ cache.keys[index] = key;
++ cache.values[index] = g;
++ }
++ if (g != Float.MIN_VALUE) {
++ // Paper end
+ float h = (float)(k - m * 2);
+ float q = (float)(l - n * 2);
+ float r = 100.0F - Mth.sqrt(h * h + q * q) * g;